diff options
47 files changed, 1566 insertions, 781 deletions
diff --git a/.gitignore b/.gitignore index b9dd252267..7f4f814050 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@  *.tgz  *.tar.gz  *.tar.bz2 +*.tar.xz  .FBCIndex  .FBCLockFolder  .deps diff --git a/EXTENSIONS b/EXTENSIONS index 61a1688b3c..af9007732b 100644 --- a/EXTENSIONS +++ b/EXTENSIONS @@ -385,6 +385,12 @@ MAINTENANCE:         Maintained  STATUS:              Working  SINCE:               4.0.4  ------------------------------------------------------------------------------- +EXTENSION:           hash +PRIMARY MAINTAINER:  Sara Golemon <pollita@php.net>, Mike Wallner <mike@php.net>, Anatol Belski <ab@php.net> +MAINTENANCE:         Maintained +STATUS:              Working +SINCE:               5.1.2 +-------------------------------------------------------------------------------  EXTENSION:           iconv  PRIMARY MAINTAINER:  Moriyoshi Koizumi <moriyoshi@php.net>  MAINTENANCE:         Maintained @@ -1,7 +1,30 @@  PHP                                                                        NEWS  ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +?? ??? 2014, PHP 5.6.2 -?? ??? 2014, PHP 5.6.1 +- Core: +  . Fixed bug #67739 (Windows 8.1/Server 2012 R2 OS build number reported +    as 6.2 (instead of 6.3)). (Christian Wenz) +  . Fixed bug #67633 (A foreach on an array returned from a function not doing +    copy-on-write). (Nikita) +  . Fixed bug #51800 (proc_open on Windows hangs forever). (Anatol) +  . Fixed bug #68118 ($a->foo .= 'test'; can leave $a->foo undefined). (Nikita) + +- FPM: +  . Fixed bug #65641 (PHP-FPM incorrectly defines the SCRIPT_NAME variable +    when using Apache, mod_proxy-fcgi and ProxyPass). (Remi) +  . Implemented FR #55508 (listen and listen.allowed_clients should take IPv6 +    addresses). (Robin Gloster) + +- Reflection: +  . Fixed bug #68103 (Duplicate entry in Reflection for class alias). (Remi) + +- OpenSSL: +  . Fixed bug #68074 (Allow to use system cipher list instead of hardcoded +    value). (Remi) + + +02 Oct 2014, PHP 5.6.1  - Core:    . Implemented FR #38409 (parse_ini_file() looses the type of booleans). (Tjerk) @@ -10,6 +33,13 @@ PHP                                                                        NEWS    . Fixed bug #67878 (program_prefix not honoured in man pages). (Remi)    . Fixed bug #67938 (Segfault when extending interface method with variadic).      (Nikita) +  . Fixed bug #67985 (Incorrect last used array index copied to new array after +    unset). (Tjerk) +  . Fixed bug #68088 (New Posthandler Potential Illegal efree() vulnerability). +    (Mike) (CVE-2014-3622) + +- DOM: +  . Made DOMNode::textContent writeable. (Tjerk)  - Fileinfo:    . Fixed bug #67731 (finfo::file() returns invalid mime type @@ -29,11 +59,13 @@ PHP                                                                        NEWS    . Fixed bug #67839 (mysqli does not handle 4-byte floats correctly). (Keyur)  - OpenSSL: +  . Fixed bug #41631 (socket timeouts not honored in blocking SSL reads). +    (Daniel Lowrey)    . Fixed bug #67850 (extension won't build if openssl compiled without SSLv3).      (Daniel Lowrey) -- DOM: -  . Made DOMNode::textContent writeable. (Tjerk) +- phpdbg: +  . Fixed issue krakjoe/phpdbg#111 (compile error without ZEND_SIGNALS). (Bob)  - SOAP:    . Fixed bug #67955 (SoapClient prepends 0-byte to cookie names). (Philip Hofstetter) @@ -41,6 +73,10 @@ PHP                                                                        NEWS  - Session:    . Fixed bug #67972 (SessionHandler Invalid memory read create_sid()). (Adam) +- Sysvsem: +  . Implemented FR #67990 (Add optional nowait argument to sem_acquire). +    (Matteo) +  28 Aug 2014, PHP 5.6.0  - Apache2 Handler SAPI: @@ -66,6 +102,7 @@ PHP                                                                        NEWS    . Fixed bug #66431 (Special Character via COM Interface (CP_UTF8)). (Anatol)  - Core: +  . Improved phpinfo() stylesheets. (Colin Viebrock)    . Fixed bug #67693 (incorrect push to the empty array). (Tjerk)    . Removed inconsistency regarding behaviour of array in constants at      run-time. (Bob) diff --git a/Zend/tests/bug67633.phpt b/Zend/tests/bug67633.phpt new file mode 100644 index 0000000000..a9e05d10ab --- /dev/null +++ b/Zend/tests/bug67633.phpt @@ -0,0 +1,44 @@ +--TEST-- +Bug #67633: A foreach on an array returned from a function not doing copy-on-write +--FILE-- +<?php + +function id($x) { +    return $x; +} + +function &ref_id(&$x) { +    return $x; +} + +$c = 'c'; +$array = ['a', 'b', $c]; + +foreach(id($array) as &$v) { +    $v .= 'q'; +} +var_dump($array); + +foreach(ref_id($array) as &$v) { +    $v .= 'q'; +} +var_dump($array); + +?> +--EXPECT-- +array(3) { +  [0]=> +  string(1) "a" +  [1]=> +  string(1) "b" +  [2]=> +  string(1) "c" +} +array(3) { +  [0]=> +  string(2) "aq" +  [1]=> +  string(2) "bq" +  [2]=> +  &string(2) "cq" +} diff --git a/Zend/tests/bug67985.phpt b/Zend/tests/bug67985.phpt new file mode 100644 index 0000000000..6f032643f4 --- /dev/null +++ b/Zend/tests/bug67985.phpt @@ -0,0 +1,16 @@ +--TEST-- +Bug #67985 - Last used array index not copied to new array at assignment +--FILE-- +<?php + +$a = ['zero', 'one', 'two']; +unset($a[2]); +$b = $a; +$a[] = 'three'; +$b[] = 'three'; + +var_dump($a === $b); + +?> +--EXPECT-- +bool(true) diff --git a/Zend/tests/bug68118.phpt b/Zend/tests/bug68118.phpt new file mode 100644 index 0000000000..c56e70a112 --- /dev/null +++ b/Zend/tests/bug68118.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #68118: $a->foo .= 'test'; can leave $a->foo undefined +--FILE-- +<?php + +set_error_handler(function() { +    $obj = new stdClass; +    $obj->test = 'meow'; +    return true; +}); +  +$a = new stdClass; +$a->undefined .= 'test'; +var_dump($a); + +?> +--EXPECT-- +object(stdClass)#2 (1) { +  ["undefined"]=> +  string(4) "test" +} diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 54b01a845b..19185dfb70 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6337,6 +6337,15 @@ void zend_do_foreach_begin(znode *foreach_token, znode *open_brackets_token, zno  		/* save the location of FETCH_W instruction(s) */  		open_brackets_token->u.op.opline_num = get_next_op_number(CG(active_op_array));  		zend_do_end_variable_parse(array, BP_VAR_W, 0 TSRMLS_CC); + +		if (zend_is_function_or_method_call(array)) { +			opline = get_next_op(CG(active_op_array) TSRMLS_CC); +			opline->opcode = ZEND_SEPARATE; +			SET_NODE(opline->op1, array); +			SET_UNUSED(opline->op2); +			opline->result_type = IS_VAR; +			opline->result.var = opline->op1.var; +		}  	} else {  		is_variable = 0;  		open_brackets_token->u.op.opline_num = get_next_op_number(CG(active_op_array)); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index c7adf38f3b..a5577d0b45 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -786,9 +786,6 @@ static zval **zend_std_get_property_ptr_ptr(zval *object, zval *member, int type  			/* we don't have access controls - will just add it */  			new_zval = &EG(uninitialized_zval); -			if(UNEXPECTED(type == BP_VAR_RW || type == BP_VAR_R)) { -				zend_error(E_NOTICE, "Undefined property: %s::$%s", zobj->ce->name, Z_STRVAL_P(member)); -			}  			Z_ADDREF_P(new_zval);  			if (EXPECTED((property_info->flags & ZEND_ACC_STATIC) == 0) &&  			    property_info->offset >= 0) { @@ -808,6 +805,12 @@ static zval **zend_std_get_property_ptr_ptr(zval *object, zval *member, int type  				}  				zend_hash_quick_update(zobj->properties, property_info->name, property_info->name_length+1, property_info->h, &new_zval, sizeof(zval *), (void **) &retval);  			} + +			/* Notice is thrown after creation of the property, to avoid EG(std_property_info) +			 * being overwritten in an error handler. */ +			if (UNEXPECTED(type == BP_VAR_RW || type == BP_VAR_R)) { +				zend_error(E_NOTICE, "Undefined property: %s::$%s", zobj->ce->name, Z_STRVAL_P(member)); +			}  		} else {  			/* we do have getter - fail and let it try again with usual get/set */  			retval = NULL; diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index 0f9e184b7e..8a41902a97 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -138,6 +138,7 @@ ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC)  				ALLOC_HASHTABLE_REL(tmp_ht);  				zend_hash_init(tmp_ht, zend_hash_num_elements(original_ht), NULL, ZVAL_PTR_DTOR, 0);  				zend_hash_copy(tmp_ht, original_ht, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); +				tmp_ht->nNextFreeElement = original_ht->nNextFreeElement;  				zvalue->value.ht = tmp_ht;  			}  			break; diff --git a/configure.in b/configure.in index 2bef7011ac..223973c59d 100644 --- a/configure.in +++ b/configure.in @@ -119,7 +119,7 @@ int zend_sprintf(char *buffer, const char *format, ...);  PHP_MAJOR_VERSION=5  PHP_MINOR_VERSION=6 -PHP_RELEASE_VERSION=1 +PHP_RELEASE_VERSION=2  PHP_EXTRA_VERSION="-dev"  PHP_VERSION="$PHP_MAJOR_VERSION.$PHP_MINOR_VERSION.$PHP_RELEASE_VERSION$PHP_EXTRA_VERSION"  PHP_VERSION_ID=`expr [$]PHP_MAJOR_VERSION \* 10000 + [$]PHP_MINOR_VERSION \* 100 + [$]PHP_RELEASE_VERSION` @@ -787,7 +787,12 @@ if test "$PHP_GCOV" = "yes"; then      AC_MSG_ERROR([ccache must be disabled when --enable-gcov option is used. You can disable ccache by setting environment variable CCACHE_DISABLE=1.])    fi -  ltp_version_list="1.5 1.6 1.7 1.9 1.10" +  dnl min: 1.5 (i.e. 105, major * 100 + minor for easier comparison) +  ltp_version_min="105" +  dnl non-working versions, e.g. "1.8 1.18"; +  dnl remove "none" when introducing the first incompatible LTP version an  +  dnl separate any following additions by spaces +  ltp_version_exclude="1.8"    AC_CHECK_PROG(LTP, lcov, lcov)    AC_CHECK_PROG(LTP_GENHTML, genhtml, genhtml) @@ -797,21 +802,30 @@ if test "$PHP_GCOV" = "yes"; then    if test "$LTP"; then      AC_CACHE_CHECK([for ltp version], php_cv_ltp_version, [        php_cv_ltp_version=invalid -      ltp_version=`$LTP -v 2>/dev/null | $SED -e 's/^.* //'` -      for ltp_check_version in $ltp_version_list; do -        if test "$ltp_version" = "$ltp_check_version"; then -          php_cv_ltp_version="$ltp_check_version (ok)" +      ltp_version_vars=`$LTP -v 2>/dev/null | $SED -e 's/^.* //' -e 's/\./ /g' | tr -d a-z` +      if test -n "$ltp_version_vars"; then +        set $ltp_version_vars +        ltp_version="${1}.${2}" +        ltp_version_num="`expr ${1} \* 100 + ${2}`" +        if test $ltp_version_num -ge $ltp_version_min; then +          php_cv_ltp_version="$ltp_version (ok)" +          for ltp_check_version in $ltp_version_exclude; do +            if test "$ltp_version" = "$ltp_check_version"; then +              php_cv_ltp_version=invalid +              break +            fi +          done          fi -      done +      fi      ])    else -    ltp_msg="To enable code coverage reporting you must have one of the following LTP versions installed: $ltp_version_list"       +    ltp_msg="To enable code coverage reporting you must have LTP installed"            AC_MSG_ERROR([$ltp_msg])    fi    case $php_cv_ltp_version in      ""|invalid[)] -      ltp_msg="You must have one of the following versions of LTP: $ltp_version_list (found: $ltp_version)." +      ltp_msg="This LTP version is not supported (found: $ltp_version, min: $ltp_version_min, excluded: $ltp_version_exclude)."        AC_MSG_ERROR([$ltp_msg])        LTP="exit 0;"        ;; diff --git a/ext/curl/tests/check_win_config.phpt b/ext/curl/tests/check_win_config.phpt index 103f1cf692..d82fe6f41a 100644 --- a/ext/curl/tests/check_win_config.phpt +++ b/ext/curl/tests/check_win_config.phpt @@ -28,7 +28,7 @@ Features  AsynchDNS => Yes
  CharConv => No
  Debug => No
 -GSS-Negotiate => Yes
 +GSS-Negotiate => No
  IDN => Yes
  IPv6 => Yes
  krb4 => No
 diff --git a/ext/date/lib/timezonedb.h b/ext/date/lib/timezonedb.h index a23104f68c..98e7b2292c 100644 --- a/ext/date/lib/timezonedb.h +++ b/ext/date/lib/timezonedb.h @@ -12,578 +12,578 @@ const timelib_tzdb_index_entry timezonedb_idx_builtin[582] = {  	{ "Africa/Blantyre"                   , 0x00052F },  	{ "Africa/Brazzaville"                , 0x000584 },  	{ "Africa/Bujumbura"                  , 0x0005D9 }, -	{ "Africa/Cairo"                      , 0x00061D }, -	{ "Africa/Casablanca"                 , 0x000A04 }, -	{ "Africa/Ceuta"                      , 0x000C66 }, -	{ "Africa/Conakry"                    , 0x000F6D }, -	{ "Africa/Dakar"                      , 0x000FC2 }, -	{ "Africa/Dar_es_Salaam"              , 0x001017 }, -	{ "Africa/Djibouti"                   , 0x001084 }, -	{ "Africa/Douala"                     , 0x0010D9 }, -	{ "Africa/El_Aaiun"                   , 0x00112E }, -	{ "Africa/Freetown"                   , 0x001359 }, -	{ "Africa/Gaborone"                   , 0x0013AE }, -	{ "Africa/Harare"                     , 0x00141B }, -	{ "Africa/Johannesburg"               , 0x001470 }, -	{ "Africa/Juba"                       , 0x0014DE }, -	{ "Africa/Kampala"                    , 0x0015F1 }, -	{ "Africa/Khartoum"                   , 0x001670 }, -	{ "Africa/Kigali"                     , 0x001783 }, -	{ "Africa/Kinshasa"                   , 0x0017D8 }, -	{ "Africa/Lagos"                      , 0x001844 }, -	{ "Africa/Libreville"                 , 0x001899 }, -	{ "Africa/Lome"                       , 0x0018EE }, -	{ "Africa/Luanda"                     , 0x001943 }, -	{ "Africa/Lubumbashi"                 , 0x001998 }, -	{ "Africa/Lusaka"                     , 0x0019F3 }, -	{ "Africa/Malabo"                     , 0x001A48 }, -	{ "Africa/Maputo"                     , 0x001A9D }, -	{ "Africa/Maseru"                     , 0x001AF2 }, -	{ "Africa/Mbabane"                    , 0x001B5A }, -	{ "Africa/Mogadishu"                  , 0x001BB0 }, -	{ "Africa/Monrovia"                   , 0x001C0B }, -	{ "Africa/Nairobi"                    , 0x001C71 }, -	{ "Africa/Ndjamena"                   , 0x001CF0 }, -	{ "Africa/Niamey"                     , 0x001D5C }, -	{ "Africa/Nouakchott"                 , 0x001DB1 }, -	{ "Africa/Ouagadougou"                , 0x001E06 }, -	{ "Africa/Porto-Novo"                 , 0x001E5B }, -	{ "Africa/Sao_Tome"                   , 0x001EB0 }, -	{ "Africa/Timbuktu"                   , 0x001F05 }, -	{ "Africa/Tripoli"                    , 0x001F5A }, -	{ "Africa/Tunis"                      , 0x002063 }, -	{ "Africa/Windhoek"                   , 0x002175 }, -	{ "America/Adak"                      , 0x0023BC }, -	{ "America/Anchorage"                 , 0x002732 }, -	{ "America/Anguilla"                  , 0x002AA6 }, -	{ "America/Antigua"                   , 0x002AFB }, -	{ "America/Araguaina"                 , 0x002B61 }, -	{ "America/Argentina/Buenos_Aires"    , 0x002CC6 }, -	{ "America/Argentina/Catamarca"       , 0x002E74 }, -	{ "America/Argentina/ComodRivadavia"  , 0x003035 }, -	{ "America/Argentina/Cordoba"         , 0x0031DB }, -	{ "America/Argentina/Jujuy"           , 0x0033B0 }, -	{ "America/Argentina/La_Rioja"        , 0x003564 }, -	{ "America/Argentina/Mendoza"         , 0x00371C }, -	{ "America/Argentina/Rio_Gallegos"    , 0x0038DC }, -	{ "America/Argentina/Salta"           , 0x003A91 }, -	{ "America/Argentina/San_Juan"        , 0x003C3D }, -	{ "America/Argentina/San_Luis"        , 0x003DF5 }, -	{ "America/Argentina/Tucuman"         , 0x003FBB }, -	{ "America/Argentina/Ushuaia"         , 0x004177 }, -	{ "America/Aruba"                     , 0x004332 }, -	{ "America/Asuncion"                  , 0x004398 }, -	{ "America/Atikokan"                  , 0x00467D }, -	{ "America/Atka"                      , 0x004753 }, -	{ "America/Bahia"                     , 0x004AB9 }, -	{ "America/Bahia_Banderas"            , 0x004C4C }, -	{ "America/Barbados"                  , 0x004EC5 }, -	{ "America/Belem"                     , 0x004F5F }, -	{ "America/Belize"                    , 0x00505A }, -	{ "America/Blanc-Sablon"              , 0x0051D6 }, -	{ "America/Boa_Vista"                 , 0x00528A }, -	{ "America/Bogota"                    , 0x005393 }, -	{ "America/Boise"                     , 0x0053FF }, -	{ "America/Buenos_Aires"              , 0x005796 }, -	{ "America/Cambridge_Bay"             , 0x00592F }, -	{ "America/Campo_Grande"              , 0x005C57 }, -	{ "America/Cancun"                    , 0x005F46 }, -	{ "America/Caracas"                   , 0x006188 }, -	{ "America/Catamarca"                 , 0x0061EF }, -	{ "America/Cayenne"                   , 0x006395 }, -	{ "America/Cayman"                    , 0x0063F7 }, -	{ "America/Chicago"                   , 0x00644C }, -	{ "America/Chihuahua"                 , 0x006963 }, -	{ "America/Coral_Harbour"             , 0x006BCE }, -	{ "America/Cordoba"                   , 0x006C60 }, -	{ "America/Costa_Rica"                , 0x006E06 }, -	{ "America/Creston"                   , 0x006E90 }, -	{ "America/Cuiaba"                    , 0x006F1C }, -	{ "America/Curacao"                   , 0x0071FA }, -	{ "America/Danmarkshavn"              , 0x007260 }, -	{ "America/Dawson"                    , 0x0073A4 }, -	{ "America/Dawson_Creek"              , 0x0076C1 }, -	{ "America/Denver"                    , 0x00789B }, -	{ "America/Detroit"                   , 0x007C21 }, -	{ "America/Dominica"                  , 0x007F80 }, -	{ "America/Edmonton"                  , 0x007FD5 }, -	{ "America/Eirunepe"                  , 0x00838D }, -	{ "America/El_Salvador"               , 0x0084A5 }, -	{ "America/Ensenada"                  , 0x00851A }, -	{ "America/Fort_Wayne"                , 0x0089C1 }, -	{ "America/Fortaleza"                 , 0x008883 }, -	{ "America/Glace_Bay"                 , 0x008C2B }, -	{ "America/Godthab"                   , 0x008FA2 }, -	{ "America/Goose_Bay"                 , 0x009266 }, -	{ "America/Grand_Turk"                , 0x009723 }, -	{ "America/Grenada"                   , 0x0098F8 }, -	{ "America/Guadeloupe"                , 0x00994D }, -	{ "America/Guatemala"                 , 0x0099A2 }, -	{ "America/Guayaquil"                 , 0x009A2B }, -	{ "America/Guyana"                    , 0x009A88 }, -	{ "America/Halifax"                   , 0x009B09 }, -	{ "America/Havana"                    , 0x00A01F }, -	{ "America/Hermosillo"                , 0x00A392 }, -	{ "America/Indiana/Indianapolis"      , 0x00A470 }, -	{ "America/Indiana/Knox"              , 0x00A701 }, -	{ "America/Indiana/Marengo"           , 0x00AA98 }, -	{ "America/Indiana/Petersburg"        , 0x00AD3E }, -	{ "America/Indiana/Tell_City"         , 0x00B28B }, -	{ "America/Indiana/Vevay"             , 0x00B524 }, -	{ "America/Indiana/Vincennes"         , 0x00B75F }, -	{ "America/Indiana/Winamac"           , 0x00BA13 }, -	{ "America/Indianapolis"              , 0x00B021 }, -	{ "America/Inuvik"                    , 0x00BCCC }, -	{ "America/Iqaluit"                   , 0x00BFC3 }, -	{ "America/Jamaica"                   , 0x00C2E5 }, -	{ "America/Jujuy"                     , 0x00C3AA }, -	{ "America/Juneau"                    , 0x00C554 }, -	{ "America/Kentucky/Louisville"       , 0x00C8D2 }, -	{ "America/Kentucky/Monticello"       , 0x00CCF0 }, -	{ "America/Knox_IN"                   , 0x00D075 }, -	{ "America/Kralendijk"                , 0x00D3E6 }, -	{ "America/La_Paz"                    , 0x00D44C }, -	{ "America/Lima"                      , 0x00D4B3 }, -	{ "America/Los_Angeles"               , 0x00D55B }, -	{ "America/Louisville"                , 0x00D96C }, -	{ "America/Lower_Princes"             , 0x00DD61 }, -	{ "America/Maceio"                    , 0x00DDC7 }, -	{ "America/Managua"                   , 0x00DF01 }, -	{ "America/Manaus"                    , 0x00DFB4 }, -	{ "America/Marigot"                   , 0x00E0B6 }, -	{ "America/Martinique"                , 0x00E10B }, -	{ "America/Matamoros"                 , 0x00E177 }, -	{ "America/Mazatlan"                  , 0x00E3D0 }, -	{ "America/Mendoza"                   , 0x00E63D }, -	{ "America/Menominee"                 , 0x00E7F1 }, -	{ "America/Merida"                    , 0x00EB72 }, -	{ "America/Metlakatla"                , 0x00EDAD }, -	{ "America/Mexico_City"               , 0x00EEE8 }, -	{ "America/Miquelon"                  , 0x00F163 }, -	{ "America/Moncton"                   , 0x00F3D5 }, -	{ "America/Monterrey"                 , 0x00F86C }, -	{ "America/Montevideo"                , 0x00FACF }, -	{ "America/Montreal"                  , 0x00FDE1 }, -	{ "America/Montserrat"                , 0x0102D1 }, -	{ "America/Nassau"                    , 0x010326 }, -	{ "America/New_York"                  , 0x01066B }, -	{ "America/Nipigon"                   , 0x010B76 }, -	{ "America/Nome"                      , 0x010EC7 }, -	{ "America/Noronha"                   , 0x011245 }, -	{ "America/North_Dakota/Beulah"       , 0x011375 }, -	{ "America/North_Dakota/Center"       , 0x011709 }, -	{ "America/North_Dakota/New_Salem"    , 0x011A9D }, -	{ "America/Ojinaga"                   , 0x011E46 }, -	{ "America/Panama"                    , 0x0120A7 }, -	{ "America/Pangnirtung"               , 0x0120FC }, -	{ "America/Paramaribo"                , 0x012432 }, -	{ "America/Phoenix"                   , 0x0124C4 }, -	{ "America/Port-au-Prince"            , 0x012582 }, -	{ "America/Port_of_Spain"             , 0x0128A6 }, -	{ "America/Porto_Acre"                , 0x0127A2 }, -	{ "America/Porto_Velho"               , 0x0128FB }, -	{ "America/Puerto_Rico"               , 0x0129F1 }, -	{ "America/Rainy_River"               , 0x012A5C }, -	{ "America/Rankin_Inlet"              , 0x012D94 }, -	{ "America/Recife"                    , 0x01307A }, -	{ "America/Regina"                    , 0x0131A4 }, -	{ "America/Resolute"                  , 0x013362 }, -	{ "America/Rio_Branco"                , 0x01364A }, -	{ "America/Rosario"                   , 0x013752 }, -	{ "America/Santa_Isabel"              , 0x0138F8 }, -	{ "America/Santarem"                  , 0x013C9B }, -	{ "America/Santiago"                  , 0x013DA0 }, -	{ "America/Santo_Domingo"             , 0x014149 }, -	{ "America/Sao_Paulo"                 , 0x01420F }, -	{ "America/Scoresbysund"              , 0x01451E }, -	{ "America/Shiprock"                  , 0x01480C }, -	{ "America/Sitka"                     , 0x014B85 }, -	{ "America/St_Barthelemy"             , 0x014F0D }, -	{ "America/St_Johns"                  , 0x014F62 }, -	{ "America/St_Kitts"                  , 0x0154B5 }, -	{ "America/St_Lucia"                  , 0x01550A }, -	{ "America/St_Thomas"                 , 0x01555F }, -	{ "America/St_Vincent"                , 0x0155B4 }, -	{ "America/Swift_Current"             , 0x015609 }, -	{ "America/Tegucigalpa"               , 0x01572A }, -	{ "America/Thule"                     , 0x0157A9 }, -	{ "America/Thunder_Bay"               , 0x0159F0 }, -	{ "America/Tijuana"                   , 0x015D39 }, -	{ "America/Toronto"                   , 0x0160D2 }, -	{ "America/Tortola"                   , 0x0165F2 }, -	{ "America/Vancouver"                 , 0x016647 }, -	{ "America/Virgin"                    , 0x016A84 }, -	{ "America/Whitehorse"                , 0x016AD9 }, -	{ "America/Winnipeg"                  , 0x016DF6 }, -	{ "America/Yakutat"                   , 0x017236 }, -	{ "America/Yellowknife"               , 0x0175A1 }, -	{ "Antarctica/Casey"                  , 0x0178B1 }, -	{ "Antarctica/Davis"                  , 0x01794F }, -	{ "Antarctica/DumontDUrville"         , 0x0179F0 }, -	{ "Antarctica/Macquarie"              , 0x017A81 }, -	{ "Antarctica/Mawson"                 , 0x017CCE }, -	{ "Antarctica/McMurdo"                , 0x017D4A }, -	{ "Antarctica/Palmer"                 , 0x0180F5 }, -	{ "Antarctica/Rothera"                , 0x018411 }, -	{ "Antarctica/South_Pole"             , 0x018487 }, -	{ "Antarctica/Syowa"                  , 0x018805 }, -	{ "Antarctica/Troll"                  , 0x018873 }, -	{ "Antarctica/Vostok"                 , 0x018A45 }, -	{ "Arctic/Longyearbyen"               , 0x018AB6 }, -	{ "Asia/Aden"                         , 0x018DE8 }, -	{ "Asia/Almaty"                       , 0x018E3D }, -	{ "Asia/Amman"                        , 0x018FBC }, -	{ "Asia/Anadyr"                       , 0x019272 }, -	{ "Asia/Aqtau"                        , 0x019474 }, -	{ "Asia/Aqtobe"                       , 0x019673 }, -	{ "Asia/Ashgabat"                     , 0x01982B }, -	{ "Asia/Ashkhabad"                    , 0x019948 }, -	{ "Asia/Baghdad"                      , 0x019A65 }, -	{ "Asia/Bahrain"                      , 0x019BDA }, -	{ "Asia/Baku"                         , 0x019C40 }, -	{ "Asia/Bangkok"                      , 0x019F28 }, -	{ "Asia/Beirut"                       , 0x019F7D }, -	{ "Asia/Bishkek"                      , 0x01A28A }, -	{ "Asia/Brunei"                       , 0x01A436 }, -	{ "Asia/Calcutta"                     , 0x01A498 }, -	{ "Asia/Chita"                        , 0x01A511 }, -	{ "Asia/Choibalsan"                   , 0x01A726 }, -	{ "Asia/Chongqing"                    , 0x01A89F }, -	{ "Asia/Chungking"                    , 0x01A93F }, -	{ "Asia/Colombo"                      , 0x01A9DF }, -	{ "Asia/Dacca"                        , 0x01AA7B }, -	{ "Asia/Damascus"                     , 0x01AB21 }, -	{ "Asia/Dhaka"                        , 0x01AE71 }, -	{ "Asia/Dili"                         , 0x01AF17 }, -	{ "Asia/Dubai"                        , 0x01AFA1 }, -	{ "Asia/Dushanbe"                     , 0x01AFF6 }, -	{ "Asia/Gaza"                         , 0x01B0F9 }, -	{ "Asia/Harbin"                       , 0x01B44C }, -	{ "Asia/Hebron"                       , 0x01B4EC }, -	{ "Asia/Ho_Chi_Minh"                  , 0x01B848 }, -	{ "Asia/Hong_Kong"                    , 0x01B8C0 }, -	{ "Asia/Hovd"                         , 0x01BA82 }, -	{ "Asia/Irkutsk"                      , 0x01BBFA }, -	{ "Asia/Istanbul"                     , 0x01BDE5 }, -	{ "Asia/Jakarta"                      , 0x01C1D2 }, -	{ "Asia/Jayapura"                     , 0x01C27C }, -	{ "Asia/Jerusalem"                    , 0x01C319 }, -	{ "Asia/Kabul"                        , 0x01C648 }, -	{ "Asia/Kamchatka"                    , 0x01C699 }, -	{ "Asia/Karachi"                      , 0x01C892 }, -	{ "Asia/Kashgar"                      , 0x01C947 }, -	{ "Asia/Kathmandu"                    , 0x01C99C }, -	{ "Asia/Katmandu"                     , 0x01CA02 }, -	{ "Asia/Khandyga"                     , 0x01CA68 }, -	{ "Asia/Kolkata"                      , 0x01CC92 }, -	{ "Asia/Krasnoyarsk"                  , 0x01CD0B }, -	{ "Asia/Kuala_Lumpur"                 , 0x01CEF8 }, -	{ "Asia/Kuching"                      , 0x01CFB5 }, -	{ "Asia/Kuwait"                       , 0x01D0A3 }, -	{ "Asia/Macao"                        , 0x01D0F8 }, -	{ "Asia/Macau"                        , 0x01D233 }, -	{ "Asia/Magadan"                      , 0x01D36E }, -	{ "Asia/Makassar"                     , 0x01D572 }, -	{ "Asia/Manila"                       , 0x01D637 }, -	{ "Asia/Muscat"                       , 0x01D6BC }, -	{ "Asia/Nicosia"                      , 0x01D711 }, -	{ "Asia/Novokuznetsk"                 , 0x01D9F9 }, -	{ "Asia/Novosibirsk"                  , 0x01DC19 }, -	{ "Asia/Omsk"                         , 0x01DE09 }, -	{ "Asia/Oral"                         , 0x01DFF5 }, -	{ "Asia/Phnom_Penh"                   , 0x01E1C5 }, -	{ "Asia/Pontianak"                    , 0x01E23D }, -	{ "Asia/Pyongyang"                    , 0x01E2FF }, -	{ "Asia/Qatar"                        , 0x01E38F }, -	{ "Asia/Qyzylorda"                    , 0x01E3F5 }, -	{ "Asia/Rangoon"                      , 0x01E5CB }, -	{ "Asia/Riyadh"                       , 0x01E643 }, -	{ "Asia/Saigon"                       , 0x01E698 }, -	{ "Asia/Sakhalin"                     , 0x01E710 }, -	{ "Asia/Samarkand"                    , 0x01E90D }, -	{ "Asia/Seoul"                        , 0x01EA43 }, -	{ "Asia/Shanghai"                     , 0x01EB0A }, -	{ "Asia/Singapore"                    , 0x01EBB6 }, -	{ "Asia/Srednekolymsk"                , 0x01EC6D }, -	{ "Asia/Taipei"                       , 0x01EE6D }, -	{ "Asia/Tashkent"                     , 0x01EF9E }, -	{ "Asia/Tbilisi"                      , 0x01F0CF }, -	{ "Asia/Tehran"                       , 0x01F289 }, -	{ "Asia/Tel_Aviv"                     , 0x01F4F7 }, -	{ "Asia/Thimbu"                       , 0x01F826 }, -	{ "Asia/Thimphu"                      , 0x01F88C }, -	{ "Asia/Tokyo"                        , 0x01F8F2 }, -	{ "Asia/Ujung_Pandang"                , 0x01F97C }, -	{ "Asia/Ulaanbaatar"                  , 0x01F9F9 }, -	{ "Asia/Ulan_Bator"                   , 0x01FB54 }, -	{ "Asia/Urumqi"                       , 0x01FCA1 }, -	{ "Asia/Ust-Nera"                     , 0x01FD03 }, -	{ "Asia/Vientiane"                    , 0x01FF15 }, -	{ "Asia/Vladivostok"                  , 0x01FF8D }, -	{ "Asia/Yakutsk"                      , 0x020177 }, -	{ "Asia/Yekaterinburg"                , 0x020361 }, -	{ "Asia/Yerevan"                      , 0x020582 }, -	{ "Atlantic/Azores"                   , 0x020782 }, -	{ "Atlantic/Bermuda"                  , 0x020C85 }, -	{ "Atlantic/Canary"                   , 0x020F66 }, -	{ "Atlantic/Cape_Verde"               , 0x02123C }, -	{ "Atlantic/Faeroe"                   , 0x0212B5 }, -	{ "Atlantic/Faroe"                    , 0x021559 }, -	{ "Atlantic/Jan_Mayen"                , 0x0217FD }, -	{ "Atlantic/Madeira"                  , 0x021B2F }, -	{ "Atlantic/Reykjavik"                , 0x022038 }, -	{ "Atlantic/South_Georgia"            , 0x0221F1 }, -	{ "Atlantic/St_Helena"                , 0x022403 }, -	{ "Atlantic/Stanley"                  , 0x022235 }, -	{ "Australia/ACT"                     , 0x022458 }, -	{ "Australia/Adelaide"                , 0x02277B }, -	{ "Australia/Brisbane"                , 0x022AAD }, -	{ "Australia/Broken_Hill"             , 0x022B7A }, -	{ "Australia/Canberra"                , 0x022EBE }, -	{ "Australia/Currie"                  , 0x0231E1 }, -	{ "Australia/Darwin"                  , 0x02351A }, -	{ "Australia/Eucla"                   , 0x0235A6 }, -	{ "Australia/Hobart"                  , 0x023682 }, -	{ "Australia/LHI"                     , 0x0239E6 }, -	{ "Australia/Lindeman"                , 0x023C87 }, -	{ "Australia/Lord_Howe"               , 0x023D6E }, -	{ "Australia/Melbourne"               , 0x02401F }, -	{ "Australia/North"                   , 0x02434A }, -	{ "Australia/NSW"                     , 0x0243C4 }, -	{ "Australia/Perth"                   , 0x0246E7 }, -	{ "Australia/Queensland"              , 0x0247C5 }, -	{ "Australia/South"                   , 0x024877 }, -	{ "Australia/Sydney"                  , 0x024B9A }, -	{ "Australia/Tasmania"                , 0x024EDD }, -	{ "Australia/Victoria"                , 0x025228 }, -	{ "Australia/West"                    , 0x02554B }, -	{ "Australia/Yancowinna"              , 0x025607 }, -	{ "Brazil/Acre"                       , 0x02592F }, -	{ "Brazil/DeNoronha"                  , 0x025A33 }, -	{ "Brazil/East"                       , 0x025B53 }, -	{ "Brazil/West"                       , 0x025E30 }, -	{ "Canada/Atlantic"                   , 0x025F28 }, -	{ "Canada/Central"                    , 0x026410 }, -	{ "Canada/East-Saskatchewan"          , 0x026D1A }, -	{ "Canada/Eastern"                    , 0x02682A }, -	{ "Canada/Mountain"                   , 0x026EA3 }, -	{ "Canada/Newfoundland"               , 0x027219 }, -	{ "Canada/Pacific"                    , 0x027744 }, -	{ "Canada/Saskatchewan"               , 0x027B5D }, -	{ "Canada/Yukon"                      , 0x027CE6 }, -	{ "CET"                               , 0x027FE9 }, -	{ "Chile/Continental"                 , 0x0282F2 }, -	{ "Chile/EasterIsland"                , 0x02868D }, -	{ "CST6CDT"                           , 0x0289CF }, -	{ "Cuba"                              , 0x028D20 }, -	{ "EET"                               , 0x029093 }, -	{ "Egypt"                             , 0x029346 }, -	{ "Eire"                              , 0x02972D }, -	{ "EST"                               , 0x029C3E }, -	{ "EST5EDT"                           , 0x029C82 }, -	{ "Etc/GMT"                           , 0x029FD3 }, -	{ "Etc/GMT+0"                         , 0x02A09F }, -	{ "Etc/GMT+1"                         , 0x02A129 }, -	{ "Etc/GMT+10"                        , 0x02A1B6 }, -	{ "Etc/GMT+11"                        , 0x02A244 }, -	{ "Etc/GMT+12"                        , 0x02A2D2 }, -	{ "Etc/GMT+2"                         , 0x02A3ED }, -	{ "Etc/GMT+3"                         , 0x02A479 }, -	{ "Etc/GMT+4"                         , 0x02A505 }, -	{ "Etc/GMT+5"                         , 0x02A591 }, -	{ "Etc/GMT+6"                         , 0x02A61D }, -	{ "Etc/GMT+7"                         , 0x02A6A9 }, -	{ "Etc/GMT+8"                         , 0x02A735 }, -	{ "Etc/GMT+9"                         , 0x02A7C1 }, -	{ "Etc/GMT-0"                         , 0x02A05B }, -	{ "Etc/GMT-1"                         , 0x02A0E3 }, -	{ "Etc/GMT-10"                        , 0x02A16F }, -	{ "Etc/GMT-11"                        , 0x02A1FD }, -	{ "Etc/GMT-12"                        , 0x02A28B }, -	{ "Etc/GMT-13"                        , 0x02A319 }, -	{ "Etc/GMT-14"                        , 0x02A360 }, -	{ "Etc/GMT-2"                         , 0x02A3A7 }, -	{ "Etc/GMT-3"                         , 0x02A433 }, -	{ "Etc/GMT-4"                         , 0x02A4BF }, -	{ "Etc/GMT-5"                         , 0x02A54B }, -	{ "Etc/GMT-6"                         , 0x02A5D7 }, -	{ "Etc/GMT-7"                         , 0x02A663 }, -	{ "Etc/GMT-8"                         , 0x02A6EF }, -	{ "Etc/GMT-9"                         , 0x02A77B }, -	{ "Etc/GMT0"                          , 0x02A017 }, -	{ "Etc/Greenwich"                     , 0x02A807 }, -	{ "Etc/UCT"                           , 0x02A84B }, -	{ "Etc/Universal"                     , 0x02A88F }, -	{ "Etc/UTC"                           , 0x02A8D3 }, -	{ "Etc/Zulu"                          , 0x02A917 }, -	{ "Europe/Amsterdam"                  , 0x02A95B }, -	{ "Europe/Andorra"                    , 0x02AD99 }, -	{ "Europe/Athens"                     , 0x02B015 }, -	{ "Europe/Belfast"                    , 0x02B358 }, -	{ "Europe/Belgrade"                   , 0x02B88F }, -	{ "Europe/Berlin"                     , 0x02BB58 }, -	{ "Europe/Bratislava"                 , 0x02BEBC }, -	{ "Europe/Brussels"                   , 0x02C1EE }, -	{ "Europe/Bucharest"                  , 0x02C625 }, -	{ "Europe/Budapest"                   , 0x02C94F }, -	{ "Europe/Busingen"                   , 0x02CCB8 }, -	{ "Europe/Chisinau"                   , 0x02CF6F }, -	{ "Europe/Copenhagen"                 , 0x02D2FD }, -	{ "Europe/Dublin"                     , 0x02D607 }, -	{ "Europe/Gibraltar"                  , 0x02DB18 }, -	{ "Europe/Guernsey"                   , 0x02DF6F }, -	{ "Europe/Helsinki"                   , 0x02E4A6 }, -	{ "Europe/Isle_of_Man"                , 0x02E75C }, -	{ "Europe/Istanbul"                   , 0x02EC93 }, -	{ "Europe/Jersey"                     , 0x02F080 }, -	{ "Europe/Kaliningrad"                , 0x02F5B7 }, -	{ "Europe/Kiev"                       , 0x02F822 }, -	{ "Europe/Lisbon"                     , 0x02FB3E }, -	{ "Europe/Ljubljana"                  , 0x030042 }, -	{ "Europe/London"                     , 0x03030B }, -	{ "Europe/Luxembourg"                 , 0x030842 }, -	{ "Europe/Madrid"                     , 0x030C98 }, -	{ "Europe/Malta"                      , 0x03105E }, -	{ "Europe/Mariehamn"                  , 0x031417 }, -	{ "Europe/Minsk"                      , 0x0316CD }, -	{ "Europe/Monaco"                     , 0x0318DB }, -	{ "Europe/Moscow"                     , 0x031D16 }, -	{ "Europe/Nicosia"                    , 0x031F70 }, -	{ "Europe/Oslo"                       , 0x032258 }, -	{ "Europe/Paris"                      , 0x03258A }, -	{ "Europe/Podgorica"                  , 0x0329D0 }, -	{ "Europe/Prague"                     , 0x032C99 }, -	{ "Europe/Riga"                       , 0x032FCB }, -	{ "Europe/Rome"                       , 0x033310 }, -	{ "Europe/Samara"                     , 0x0336D3 }, -	{ "Europe/San_Marino"                 , 0x03393C }, -	{ "Europe/Sarajevo"                   , 0x033CFF }, -	{ "Europe/Simferopol"                 , 0x033FC8 }, -	{ "Europe/Skopje"                     , 0x034219 }, -	{ "Europe/Sofia"                      , 0x0344E2 }, -	{ "Europe/Stockholm"                  , 0x0347EA }, -	{ "Europe/Tallinn"                    , 0x034A99 }, -	{ "Europe/Tirane"                     , 0x034DD3 }, -	{ "Europe/Tiraspol"                   , 0x0350D9 }, -	{ "Europe/Uzhgorod"                   , 0x035467 }, -	{ "Europe/Vaduz"                      , 0x03577E }, -	{ "Europe/Vatican"                    , 0x035A2D }, -	{ "Europe/Vienna"                     , 0x035DF0 }, -	{ "Europe/Vilnius"                    , 0x03611D }, -	{ "Europe/Volgograd"                  , 0x03645C }, -	{ "Europe/Warsaw"                     , 0x03667D }, -	{ "Europe/Zagreb"                     , 0x036A5E }, -	{ "Europe/Zaporozhye"                 , 0x036D27 }, -	{ "Europe/Zurich"                     , 0x037068 }, -	{ "Factory"                           , 0x037317 }, -	{ "GB"                                , 0x037388 }, -	{ "GB-Eire"                           , 0x0378BF }, -	{ "GMT"                               , 0x037DF6 }, -	{ "GMT+0"                             , 0x037EC2 }, -	{ "GMT-0"                             , 0x037E7E }, -	{ "GMT0"                              , 0x037E3A }, -	{ "Greenwich"                         , 0x037F06 }, -	{ "Hongkong"                          , 0x037F4A }, -	{ "HST"                               , 0x03810C }, -	{ "Iceland"                           , 0x038150 }, -	{ "Indian/Antananarivo"               , 0x038309 }, -	{ "Indian/Chagos"                     , 0x03837D }, -	{ "Indian/Christmas"                  , 0x0383DF }, -	{ "Indian/Cocos"                      , 0x038423 }, -	{ "Indian/Comoro"                     , 0x038467 }, -	{ "Indian/Kerguelen"                  , 0x0384BC }, -	{ "Indian/Mahe"                       , 0x038511 }, -	{ "Indian/Maldives"                   , 0x038566 }, -	{ "Indian/Mauritius"                  , 0x0385BB }, -	{ "Indian/Mayotte"                    , 0x038631 }, -	{ "Indian/Reunion"                    , 0x038686 }, -	{ "Iran"                              , 0x0386DB }, -	{ "Israel"                            , 0x038949 }, -	{ "Jamaica"                           , 0x038C78 }, -	{ "Japan"                             , 0x038D3D }, -	{ "Kwajalein"                         , 0x038DC7 }, -	{ "Libya"                             , 0x038E2A }, -	{ "MET"                               , 0x038F33 }, -	{ "Mexico/BajaNorte"                  , 0x03923C }, -	{ "Mexico/BajaSur"                    , 0x0395A5 }, -	{ "Mexico/General"                    , 0x0397EA }, -	{ "MST"                               , 0x039A48 }, -	{ "MST7MDT"                           , 0x039A8C }, -	{ "Navajo"                            , 0x039DDD }, -	{ "NZ"                                , 0x03A156 }, -	{ "NZ-CHAT"                           , 0x03A4D4 }, -	{ "Pacific/Apia"                      , 0x03A7B8 }, -	{ "Pacific/Auckland"                  , 0x03A954 }, -	{ "Pacific/Chatham"                   , 0x03ACE0 }, -	{ "Pacific/Chuuk"                     , 0x03AFD3 }, -	{ "Pacific/Easter"                    , 0x03B02C }, -	{ "Pacific/Efate"                     , 0x03B37B }, -	{ "Pacific/Enderbury"                 , 0x03B441 }, -	{ "Pacific/Fakaofo"                   , 0x03B4AF }, -	{ "Pacific/Fiji"                      , 0x03B500 }, -	{ "Pacific/Funafuti"                  , 0x03B693 }, -	{ "Pacific/Galapagos"                 , 0x03B6D7 }, -	{ "Pacific/Gambier"                   , 0x03B74F }, -	{ "Pacific/Guadalcanal"               , 0x03B7B4 }, -	{ "Pacific/Guam"                      , 0x03B809 }, -	{ "Pacific/Honolulu"                  , 0x03B85F }, -	{ "Pacific/Johnston"                  , 0x03B8D6 }, -	{ "Pacific/Kiritimati"                , 0x03B955 }, -	{ "Pacific/Kosrae"                    , 0x03B9C0 }, -	{ "Pacific/Kwajalein"                 , 0x03BA1D }, -	{ "Pacific/Majuro"                    , 0x03BA89 }, -	{ "Pacific/Marquesas"                 , 0x03BAE8 }, -	{ "Pacific/Midway"                    , 0x03BB4F }, -	{ "Pacific/Nauru"                     , 0x03BBD9 }, -	{ "Pacific/Niue"                      , 0x03BC51 }, -	{ "Pacific/Norfolk"                   , 0x03BCAF }, -	{ "Pacific/Noumea"                    , 0x03BD04 }, -	{ "Pacific/Pago_Pago"                 , 0x03BD94 }, -	{ "Pacific/Palau"                     , 0x03BE0B }, -	{ "Pacific/Pitcairn"                  , 0x03BE4F }, -	{ "Pacific/Pohnpei"                   , 0x03BEA4 }, -	{ "Pacific/Ponape"                    , 0x03BEF9 }, -	{ "Pacific/Port_Moresby"              , 0x03BF3E }, -	{ "Pacific/Rarotonga"                 , 0x03BF82 }, -	{ "Pacific/Saipan"                    , 0x03C05E }, -	{ "Pacific/Samoa"                     , 0x03C0C1 }, -	{ "Pacific/Tahiti"                    , 0x03C138 }, -	{ "Pacific/Tarawa"                    , 0x03C19D }, -	{ "Pacific/Tongatapu"                 , 0x03C1F1 }, -	{ "Pacific/Truk"                      , 0x03C27D }, -	{ "Pacific/Wake"                      , 0x03C2C2 }, -	{ "Pacific/Wallis"                    , 0x03C312 }, -	{ "Pacific/Yap"                       , 0x03C356 }, -	{ "Poland"                            , 0x03C39B }, -	{ "Portugal"                          , 0x03C77C }, -	{ "PRC"                               , 0x03CC78 }, -	{ "PST8PDT"                           , 0x03CD18 }, -	{ "ROC"                               , 0x03D069 }, -	{ "ROK"                               , 0x03D19A }, -	{ "Singapore"                         , 0x03D261 }, -	{ "Turkey"                            , 0x03D318 }, -	{ "UCT"                               , 0x03D705 }, -	{ "Universal"                         , 0x03D749 }, -	{ "US/Alaska"                         , 0x03D78D }, -	{ "US/Aleutian"                       , 0x03DAF6 }, -	{ "US/Arizona"                        , 0x03DE5C }, -	{ "US/Central"                        , 0x03DEEA }, -	{ "US/East-Indiana"                   , 0x03E8F4 }, -	{ "US/Eastern"                        , 0x03E3F5 }, -	{ "US/Hawaii"                         , 0x03EB5E }, -	{ "US/Indiana-Starke"                 , 0x03EBCF }, -	{ "US/Michigan"                       , 0x03EF40 }, -	{ "US/Mountain"                       , 0x03F277 }, -	{ "US/Pacific"                        , 0x03F5F0 }, -	{ "US/Pacific-New"                    , 0x03F9F5 }, -	{ "US/Samoa"                          , 0x03FDFA }, -	{ "UTC"                               , 0x03FE71 }, -	{ "W-SU"                              , 0x040168 }, -	{ "WET"                               , 0x03FEB5 }, -	{ "Zulu"                              , 0x0403AB }, +	{ "Africa/Cairo"                      , 0x00062E }, +	{ "Africa/Casablanca"                 , 0x000A15 }, +	{ "Africa/Ceuta"                      , 0x000C77 }, +	{ "Africa/Conakry"                    , 0x000F7E }, +	{ "Africa/Dakar"                      , 0x000FD3 }, +	{ "Africa/Dar_es_Salaam"              , 0x001028 }, +	{ "Africa/Djibouti"                   , 0x001095 }, +	{ "Africa/Douala"                     , 0x0010EA }, +	{ "Africa/El_Aaiun"                   , 0x00113F }, +	{ "Africa/Freetown"                   , 0x00136A }, +	{ "Africa/Gaborone"                   , 0x0013BF }, +	{ "Africa/Harare"                     , 0x001414 }, +	{ "Africa/Johannesburg"               , 0x001469 }, +	{ "Africa/Juba"                       , 0x0014D7 }, +	{ "Africa/Kampala"                    , 0x0015EA }, +	{ "Africa/Khartoum"                   , 0x001669 }, +	{ "Africa/Kigali"                     , 0x00177C }, +	{ "Africa/Kinshasa"                   , 0x0017D1 }, +	{ "Africa/Lagos"                      , 0x00183D }, +	{ "Africa/Libreville"                 , 0x001892 }, +	{ "Africa/Lome"                       , 0x0018E7 }, +	{ "Africa/Luanda"                     , 0x00193C }, +	{ "Africa/Lubumbashi"                 , 0x001991 }, +	{ "Africa/Lusaka"                     , 0x0019FD }, +	{ "Africa/Malabo"                     , 0x001A52 }, +	{ "Africa/Maputo"                     , 0x001AA7 }, +	{ "Africa/Maseru"                     , 0x001AFC }, +	{ "Africa/Mbabane"                    , 0x001B6A }, +	{ "Africa/Mogadishu"                  , 0x001BD8 }, +	{ "Africa/Monrovia"                   , 0x001C33 }, +	{ "Africa/Nairobi"                    , 0x001C99 }, +	{ "Africa/Ndjamena"                   , 0x001D18 }, +	{ "Africa/Niamey"                     , 0x001D84 }, +	{ "Africa/Nouakchott"                 , 0x001DD9 }, +	{ "Africa/Ouagadougou"                , 0x001E2E }, +	{ "Africa/Porto-Novo"                 , 0x001E83 }, +	{ "Africa/Sao_Tome"                   , 0x001ED8 }, +	{ "Africa/Timbuktu"                   , 0x001F2D }, +	{ "Africa/Tripoli"                    , 0x001F82 }, +	{ "Africa/Tunis"                      , 0x00208B }, +	{ "Africa/Windhoek"                   , 0x00219D }, +	{ "America/Adak"                      , 0x0023E4 }, +	{ "America/Anchorage"                 , 0x00275A }, +	{ "America/Anguilla"                  , 0x002ACE }, +	{ "America/Antigua"                   , 0x002B23 }, +	{ "America/Araguaina"                 , 0x002B89 }, +	{ "America/Argentina/Buenos_Aires"    , 0x002CEE }, +	{ "America/Argentina/Catamarca"       , 0x002E9C }, +	{ "America/Argentina/ComodRivadavia"  , 0x00305D }, +	{ "America/Argentina/Cordoba"         , 0x003203 }, +	{ "America/Argentina/Jujuy"           , 0x0033D8 }, +	{ "America/Argentina/La_Rioja"        , 0x00358C }, +	{ "America/Argentina/Mendoza"         , 0x003744 }, +	{ "America/Argentina/Rio_Gallegos"    , 0x003904 }, +	{ "America/Argentina/Salta"           , 0x003AB9 }, +	{ "America/Argentina/San_Juan"        , 0x003C65 }, +	{ "America/Argentina/San_Luis"        , 0x003E1D }, +	{ "America/Argentina/Tucuman"         , 0x003FE3 }, +	{ "America/Argentina/Ushuaia"         , 0x00419F }, +	{ "America/Aruba"                     , 0x00435A }, +	{ "America/Asuncion"                  , 0x0043C0 }, +	{ "America/Atikokan"                  , 0x0046A5 }, +	{ "America/Atka"                      , 0x00477B }, +	{ "America/Bahia"                     , 0x004AE1 }, +	{ "America/Bahia_Banderas"            , 0x004C74 }, +	{ "America/Barbados"                  , 0x004EED }, +	{ "America/Belem"                     , 0x004F87 }, +	{ "America/Belize"                    , 0x005082 }, +	{ "America/Blanc-Sablon"              , 0x0051FE }, +	{ "America/Boa_Vista"                 , 0x0052B2 }, +	{ "America/Bogota"                    , 0x0053BB }, +	{ "America/Boise"                     , 0x005427 }, +	{ "America/Buenos_Aires"              , 0x0057BE }, +	{ "America/Cambridge_Bay"             , 0x005957 }, +	{ "America/Campo_Grande"              , 0x005C7F }, +	{ "America/Cancun"                    , 0x005F6E }, +	{ "America/Caracas"                   , 0x0061B0 }, +	{ "America/Catamarca"                 , 0x006217 }, +	{ "America/Cayenne"                   , 0x0063BD }, +	{ "America/Cayman"                    , 0x00641F }, +	{ "America/Chicago"                   , 0x006474 }, +	{ "America/Chihuahua"                 , 0x00698B }, +	{ "America/Coral_Harbour"             , 0x006BF6 }, +	{ "America/Cordoba"                   , 0x006C88 }, +	{ "America/Costa_Rica"                , 0x006E2E }, +	{ "America/Creston"                   , 0x006EB8 }, +	{ "America/Cuiaba"                    , 0x006F44 }, +	{ "America/Curacao"                   , 0x007222 }, +	{ "America/Danmarkshavn"              , 0x007288 }, +	{ "America/Dawson"                    , 0x0073CC }, +	{ "America/Dawson_Creek"              , 0x0076E9 }, +	{ "America/Denver"                    , 0x0078C3 }, +	{ "America/Detroit"                   , 0x007C49 }, +	{ "America/Dominica"                  , 0x007FA8 }, +	{ "America/Edmonton"                  , 0x007FFD }, +	{ "America/Eirunepe"                  , 0x0083B5 }, +	{ "America/El_Salvador"               , 0x0084CD }, +	{ "America/Ensenada"                  , 0x008542 }, +	{ "America/Fort_Wayne"                , 0x0089E9 }, +	{ "America/Fortaleza"                 , 0x0088AB }, +	{ "America/Glace_Bay"                 , 0x008C53 }, +	{ "America/Godthab"                   , 0x008FCA }, +	{ "America/Goose_Bay"                 , 0x00928E }, +	{ "America/Grand_Turk"                , 0x00974B }, +	{ "America/Grenada"                   , 0x009920 }, +	{ "America/Guadeloupe"                , 0x009975 }, +	{ "America/Guatemala"                 , 0x0099CA }, +	{ "America/Guayaquil"                 , 0x009A53 }, +	{ "America/Guyana"                    , 0x009AB0 }, +	{ "America/Halifax"                   , 0x009B31 }, +	{ "America/Havana"                    , 0x00A047 }, +	{ "America/Hermosillo"                , 0x00A3BA }, +	{ "America/Indiana/Indianapolis"      , 0x00A498 }, +	{ "America/Indiana/Knox"              , 0x00A729 }, +	{ "America/Indiana/Marengo"           , 0x00AAC0 }, +	{ "America/Indiana/Petersburg"        , 0x00AD66 }, +	{ "America/Indiana/Tell_City"         , 0x00B2B3 }, +	{ "America/Indiana/Vevay"             , 0x00B54C }, +	{ "America/Indiana/Vincennes"         , 0x00B787 }, +	{ "America/Indiana/Winamac"           , 0x00BA3B }, +	{ "America/Indianapolis"              , 0x00B049 }, +	{ "America/Inuvik"                    , 0x00BCF4 }, +	{ "America/Iqaluit"                   , 0x00BFEB }, +	{ "America/Jamaica"                   , 0x00C30D }, +	{ "America/Jujuy"                     , 0x00C3D2 }, +	{ "America/Juneau"                    , 0x00C57C }, +	{ "America/Kentucky/Louisville"       , 0x00C8FA }, +	{ "America/Kentucky/Monticello"       , 0x00CD18 }, +	{ "America/Knox_IN"                   , 0x00D09D }, +	{ "America/Kralendijk"                , 0x00D40E }, +	{ "America/La_Paz"                    , 0x00D474 }, +	{ "America/Lima"                      , 0x00D4DB }, +	{ "America/Los_Angeles"               , 0x00D583 }, +	{ "America/Louisville"                , 0x00D994 }, +	{ "America/Lower_Princes"             , 0x00DD89 }, +	{ "America/Maceio"                    , 0x00DDEF }, +	{ "America/Managua"                   , 0x00DF29 }, +	{ "America/Manaus"                    , 0x00DFDC }, +	{ "America/Marigot"                   , 0x00E0DE }, +	{ "America/Martinique"                , 0x00E133 }, +	{ "America/Matamoros"                 , 0x00E19F }, +	{ "America/Mazatlan"                  , 0x00E3F8 }, +	{ "America/Mendoza"                   , 0x00E665 }, +	{ "America/Menominee"                 , 0x00E819 }, +	{ "America/Merida"                    , 0x00EB9A }, +	{ "America/Metlakatla"                , 0x00EDD5 }, +	{ "America/Mexico_City"               , 0x00EF10 }, +	{ "America/Miquelon"                  , 0x00F18B }, +	{ "America/Moncton"                   , 0x00F3FD }, +	{ "America/Monterrey"                 , 0x00F894 }, +	{ "America/Montevideo"                , 0x00FAF7 }, +	{ "America/Montreal"                  , 0x00FE09 }, +	{ "America/Montserrat"                , 0x0102F9 }, +	{ "America/Nassau"                    , 0x01034E }, +	{ "America/New_York"                  , 0x010693 }, +	{ "America/Nipigon"                   , 0x010B9E }, +	{ "America/Nome"                      , 0x010EEF }, +	{ "America/Noronha"                   , 0x01126D }, +	{ "America/North_Dakota/Beulah"       , 0x01139D }, +	{ "America/North_Dakota/Center"       , 0x011731 }, +	{ "America/North_Dakota/New_Salem"    , 0x011AC5 }, +	{ "America/Ojinaga"                   , 0x011E6E }, +	{ "America/Panama"                    , 0x0120CF }, +	{ "America/Pangnirtung"               , 0x012124 }, +	{ "America/Paramaribo"                , 0x01245A }, +	{ "America/Phoenix"                   , 0x0124EC }, +	{ "America/Port-au-Prince"            , 0x0125AA }, +	{ "America/Port_of_Spain"             , 0x0128CE }, +	{ "America/Porto_Acre"                , 0x0127CA }, +	{ "America/Porto_Velho"               , 0x012923 }, +	{ "America/Puerto_Rico"               , 0x012A19 }, +	{ "America/Rainy_River"               , 0x012A84 }, +	{ "America/Rankin_Inlet"              , 0x012DBC }, +	{ "America/Recife"                    , 0x0130A2 }, +	{ "America/Regina"                    , 0x0131CC }, +	{ "America/Resolute"                  , 0x01338A }, +	{ "America/Rio_Branco"                , 0x013672 }, +	{ "America/Rosario"                   , 0x01377A }, +	{ "America/Santa_Isabel"              , 0x013920 }, +	{ "America/Santarem"                  , 0x013CC3 }, +	{ "America/Santiago"                  , 0x013DC8 }, +	{ "America/Santo_Domingo"             , 0x014171 }, +	{ "America/Sao_Paulo"                 , 0x014237 }, +	{ "America/Scoresbysund"              , 0x014546 }, +	{ "America/Shiprock"                  , 0x014834 }, +	{ "America/Sitka"                     , 0x014BAD }, +	{ "America/St_Barthelemy"             , 0x014F35 }, +	{ "America/St_Johns"                  , 0x014F8A }, +	{ "America/St_Kitts"                  , 0x0154DD }, +	{ "America/St_Lucia"                  , 0x015532 }, +	{ "America/St_Thomas"                 , 0x015587 }, +	{ "America/St_Vincent"                , 0x0155DC }, +	{ "America/Swift_Current"             , 0x015631 }, +	{ "America/Tegucigalpa"               , 0x015752 }, +	{ "America/Thule"                     , 0x0157D1 }, +	{ "America/Thunder_Bay"               , 0x015A18 }, +	{ "America/Tijuana"                   , 0x015D61 }, +	{ "America/Toronto"                   , 0x0160FA }, +	{ "America/Tortola"                   , 0x01661A }, +	{ "America/Vancouver"                 , 0x01666F }, +	{ "America/Virgin"                    , 0x016AAC }, +	{ "America/Whitehorse"                , 0x016B01 }, +	{ "America/Winnipeg"                  , 0x016E1E }, +	{ "America/Yakutat"                   , 0x01725E }, +	{ "America/Yellowknife"               , 0x0175C9 }, +	{ "Antarctica/Casey"                  , 0x0178D9 }, +	{ "Antarctica/Davis"                  , 0x017977 }, +	{ "Antarctica/DumontDUrville"         , 0x017A18 }, +	{ "Antarctica/Macquarie"              , 0x017AA9 }, +	{ "Antarctica/Mawson"                 , 0x017CF6 }, +	{ "Antarctica/McMurdo"                , 0x017D72 }, +	{ "Antarctica/Palmer"                 , 0x01811D }, +	{ "Antarctica/Rothera"                , 0x018439 }, +	{ "Antarctica/South_Pole"             , 0x0184AF }, +	{ "Antarctica/Syowa"                  , 0x01882D }, +	{ "Antarctica/Troll"                  , 0x01889B }, +	{ "Antarctica/Vostok"                 , 0x018A6D }, +	{ "Arctic/Longyearbyen"               , 0x018ADE }, +	{ "Asia/Aden"                         , 0x018E10 }, +	{ "Asia/Almaty"                       , 0x018E65 }, +	{ "Asia/Amman"                        , 0x018FE4 }, +	{ "Asia/Anadyr"                       , 0x01929A }, +	{ "Asia/Aqtau"                        , 0x01949C }, +	{ "Asia/Aqtobe"                       , 0x01969B }, +	{ "Asia/Ashgabat"                     , 0x019853 }, +	{ "Asia/Ashkhabad"                    , 0x019970 }, +	{ "Asia/Baghdad"                      , 0x019A8D }, +	{ "Asia/Bahrain"                      , 0x019C02 }, +	{ "Asia/Baku"                         , 0x019C68 }, +	{ "Asia/Bangkok"                      , 0x019F50 }, +	{ "Asia/Beirut"                       , 0x019FA5 }, +	{ "Asia/Bishkek"                      , 0x01A2B2 }, +	{ "Asia/Brunei"                       , 0x01A45E }, +	{ "Asia/Calcutta"                     , 0x01A4C0 }, +	{ "Asia/Chita"                        , 0x01A539 }, +	{ "Asia/Choibalsan"                   , 0x01A74E }, +	{ "Asia/Chongqing"                    , 0x01A8C7 }, +	{ "Asia/Chungking"                    , 0x01A967 }, +	{ "Asia/Colombo"                      , 0x01AA07 }, +	{ "Asia/Dacca"                        , 0x01AAA3 }, +	{ "Asia/Damascus"                     , 0x01AB49 }, +	{ "Asia/Dhaka"                        , 0x01AE99 }, +	{ "Asia/Dili"                         , 0x01AF3F }, +	{ "Asia/Dubai"                        , 0x01AFC9 }, +	{ "Asia/Dushanbe"                     , 0x01B01E }, +	{ "Asia/Gaza"                         , 0x01B121 }, +	{ "Asia/Harbin"                       , 0x01B474 }, +	{ "Asia/Hebron"                       , 0x01B514 }, +	{ "Asia/Ho_Chi_Minh"                  , 0x01B870 }, +	{ "Asia/Hong_Kong"                    , 0x01B8E8 }, +	{ "Asia/Hovd"                         , 0x01BAAA }, +	{ "Asia/Irkutsk"                      , 0x01BC22 }, +	{ "Asia/Istanbul"                     , 0x01BE0D }, +	{ "Asia/Jakarta"                      , 0x01C1FA }, +	{ "Asia/Jayapura"                     , 0x01C2A4 }, +	{ "Asia/Jerusalem"                    , 0x01C341 }, +	{ "Asia/Kabul"                        , 0x01C670 }, +	{ "Asia/Kamchatka"                    , 0x01C6C1 }, +	{ "Asia/Karachi"                      , 0x01C8BA }, +	{ "Asia/Kashgar"                      , 0x01C96F }, +	{ "Asia/Kathmandu"                    , 0x01C9C4 }, +	{ "Asia/Katmandu"                     , 0x01CA2A }, +	{ "Asia/Khandyga"                     , 0x01CA90 }, +	{ "Asia/Kolkata"                      , 0x01CCBA }, +	{ "Asia/Krasnoyarsk"                  , 0x01CD33 }, +	{ "Asia/Kuala_Lumpur"                 , 0x01CF20 }, +	{ "Asia/Kuching"                      , 0x01CFDD }, +	{ "Asia/Kuwait"                       , 0x01D0CB }, +	{ "Asia/Macao"                        , 0x01D120 }, +	{ "Asia/Macau"                        , 0x01D25B }, +	{ "Asia/Magadan"                      , 0x01D396 }, +	{ "Asia/Makassar"                     , 0x01D59A }, +	{ "Asia/Manila"                       , 0x01D65F }, +	{ "Asia/Muscat"                       , 0x01D6E4 }, +	{ "Asia/Nicosia"                      , 0x01D739 }, +	{ "Asia/Novokuznetsk"                 , 0x01DA21 }, +	{ "Asia/Novosibirsk"                  , 0x01DC41 }, +	{ "Asia/Omsk"                         , 0x01DE31 }, +	{ "Asia/Oral"                         , 0x01E01D }, +	{ "Asia/Phnom_Penh"                   , 0x01E1ED }, +	{ "Asia/Pontianak"                    , 0x01E265 }, +	{ "Asia/Pyongyang"                    , 0x01E327 }, +	{ "Asia/Qatar"                        , 0x01E3B7 }, +	{ "Asia/Qyzylorda"                    , 0x01E41D }, +	{ "Asia/Rangoon"                      , 0x01E5F3 }, +	{ "Asia/Riyadh"                       , 0x01E66B }, +	{ "Asia/Saigon"                       , 0x01E6C0 }, +	{ "Asia/Sakhalin"                     , 0x01E738 }, +	{ "Asia/Samarkand"                    , 0x01E935 }, +	{ "Asia/Seoul"                        , 0x01EA6B }, +	{ "Asia/Shanghai"                     , 0x01EB32 }, +	{ "Asia/Singapore"                    , 0x01EBDE }, +	{ "Asia/Srednekolymsk"                , 0x01EC95 }, +	{ "Asia/Taipei"                       , 0x01EE95 }, +	{ "Asia/Tashkent"                     , 0x01EFC6 }, +	{ "Asia/Tbilisi"                      , 0x01F0F7 }, +	{ "Asia/Tehran"                       , 0x01F2B1 }, +	{ "Asia/Tel_Aviv"                     , 0x01F51F }, +	{ "Asia/Thimbu"                       , 0x01F84E }, +	{ "Asia/Thimphu"                      , 0x01F8B4 }, +	{ "Asia/Tokyo"                        , 0x01F91A }, +	{ "Asia/Ujung_Pandang"                , 0x01F9A4 }, +	{ "Asia/Ulaanbaatar"                  , 0x01FA21 }, +	{ "Asia/Ulan_Bator"                   , 0x01FB7C }, +	{ "Asia/Urumqi"                       , 0x01FCC9 }, +	{ "Asia/Ust-Nera"                     , 0x01FD2B }, +	{ "Asia/Vientiane"                    , 0x01FF3D }, +	{ "Asia/Vladivostok"                  , 0x01FFB5 }, +	{ "Asia/Yakutsk"                      , 0x02019F }, +	{ "Asia/Yekaterinburg"                , 0x020389 }, +	{ "Asia/Yerevan"                      , 0x0205AA }, +	{ "Atlantic/Azores"                   , 0x0207AA }, +	{ "Atlantic/Bermuda"                  , 0x020CAD }, +	{ "Atlantic/Canary"                   , 0x020F8E }, +	{ "Atlantic/Cape_Verde"               , 0x021264 }, +	{ "Atlantic/Faeroe"                   , 0x0212DD }, +	{ "Atlantic/Faroe"                    , 0x021581 }, +	{ "Atlantic/Jan_Mayen"                , 0x021825 }, +	{ "Atlantic/Madeira"                  , 0x021B57 }, +	{ "Atlantic/Reykjavik"                , 0x022060 }, +	{ "Atlantic/South_Georgia"            , 0x022219 }, +	{ "Atlantic/St_Helena"                , 0x02242B }, +	{ "Atlantic/Stanley"                  , 0x02225D }, +	{ "Australia/ACT"                     , 0x022480 }, +	{ "Australia/Adelaide"                , 0x0227A3 }, +	{ "Australia/Brisbane"                , 0x022AD5 }, +	{ "Australia/Broken_Hill"             , 0x022BA2 }, +	{ "Australia/Canberra"                , 0x022EE6 }, +	{ "Australia/Currie"                  , 0x023209 }, +	{ "Australia/Darwin"                  , 0x023542 }, +	{ "Australia/Eucla"                   , 0x0235CE }, +	{ "Australia/Hobart"                  , 0x0236AA }, +	{ "Australia/LHI"                     , 0x023A0E }, +	{ "Australia/Lindeman"                , 0x023CAF }, +	{ "Australia/Lord_Howe"               , 0x023D96 }, +	{ "Australia/Melbourne"               , 0x024047 }, +	{ "Australia/North"                   , 0x024372 }, +	{ "Australia/NSW"                     , 0x0243EC }, +	{ "Australia/Perth"                   , 0x02470F }, +	{ "Australia/Queensland"              , 0x0247ED }, +	{ "Australia/South"                   , 0x02489F }, +	{ "Australia/Sydney"                  , 0x024BC2 }, +	{ "Australia/Tasmania"                , 0x024F05 }, +	{ "Australia/Victoria"                , 0x025250 }, +	{ "Australia/West"                    , 0x025573 }, +	{ "Australia/Yancowinna"              , 0x02562F }, +	{ "Brazil/Acre"                       , 0x025957 }, +	{ "Brazil/DeNoronha"                  , 0x025A5B }, +	{ "Brazil/East"                       , 0x025B7B }, +	{ "Brazil/West"                       , 0x025E58 }, +	{ "Canada/Atlantic"                   , 0x025F50 }, +	{ "Canada/Central"                    , 0x026438 }, +	{ "Canada/East-Saskatchewan"          , 0x026D42 }, +	{ "Canada/Eastern"                    , 0x026852 }, +	{ "Canada/Mountain"                   , 0x026ECB }, +	{ "Canada/Newfoundland"               , 0x027241 }, +	{ "Canada/Pacific"                    , 0x02776C }, +	{ "Canada/Saskatchewan"               , 0x027B85 }, +	{ "Canada/Yukon"                      , 0x027D0E }, +	{ "CET"                               , 0x028011 }, +	{ "Chile/Continental"                 , 0x02831A }, +	{ "Chile/EasterIsland"                , 0x0286B5 }, +	{ "CST6CDT"                           , 0x0289F7 }, +	{ "Cuba"                              , 0x028D48 }, +	{ "EET"                               , 0x0290BB }, +	{ "Egypt"                             , 0x02936E }, +	{ "Eire"                              , 0x029755 }, +	{ "EST"                               , 0x029C66 }, +	{ "EST5EDT"                           , 0x029CAA }, +	{ "Etc/GMT"                           , 0x029FFB }, +	{ "Etc/GMT+0"                         , 0x02A0C7 }, +	{ "Etc/GMT+1"                         , 0x02A151 }, +	{ "Etc/GMT+10"                        , 0x02A1DE }, +	{ "Etc/GMT+11"                        , 0x02A26C }, +	{ "Etc/GMT+12"                        , 0x02A2FA }, +	{ "Etc/GMT+2"                         , 0x02A415 }, +	{ "Etc/GMT+3"                         , 0x02A4A1 }, +	{ "Etc/GMT+4"                         , 0x02A52D }, +	{ "Etc/GMT+5"                         , 0x02A5B9 }, +	{ "Etc/GMT+6"                         , 0x02A645 }, +	{ "Etc/GMT+7"                         , 0x02A6D1 }, +	{ "Etc/GMT+8"                         , 0x02A75D }, +	{ "Etc/GMT+9"                         , 0x02A7E9 }, +	{ "Etc/GMT-0"                         , 0x02A083 }, +	{ "Etc/GMT-1"                         , 0x02A10B }, +	{ "Etc/GMT-10"                        , 0x02A197 }, +	{ "Etc/GMT-11"                        , 0x02A225 }, +	{ "Etc/GMT-12"                        , 0x02A2B3 }, +	{ "Etc/GMT-13"                        , 0x02A341 }, +	{ "Etc/GMT-14"                        , 0x02A388 }, +	{ "Etc/GMT-2"                         , 0x02A3CF }, +	{ "Etc/GMT-3"                         , 0x02A45B }, +	{ "Etc/GMT-4"                         , 0x02A4E7 }, +	{ "Etc/GMT-5"                         , 0x02A573 }, +	{ "Etc/GMT-6"                         , 0x02A5FF }, +	{ "Etc/GMT-7"                         , 0x02A68B }, +	{ "Etc/GMT-8"                         , 0x02A717 }, +	{ "Etc/GMT-9"                         , 0x02A7A3 }, +	{ "Etc/GMT0"                          , 0x02A03F }, +	{ "Etc/Greenwich"                     , 0x02A82F }, +	{ "Etc/UCT"                           , 0x02A873 }, +	{ "Etc/Universal"                     , 0x02A8B7 }, +	{ "Etc/UTC"                           , 0x02A8FB }, +	{ "Etc/Zulu"                          , 0x02A93F }, +	{ "Europe/Amsterdam"                  , 0x02A983 }, +	{ "Europe/Andorra"                    , 0x02ADC1 }, +	{ "Europe/Athens"                     , 0x02B03D }, +	{ "Europe/Belfast"                    , 0x02B380 }, +	{ "Europe/Belgrade"                   , 0x02B8B7 }, +	{ "Europe/Berlin"                     , 0x02BB80 }, +	{ "Europe/Bratislava"                 , 0x02BEE4 }, +	{ "Europe/Brussels"                   , 0x02C216 }, +	{ "Europe/Bucharest"                  , 0x02C64D }, +	{ "Europe/Budapest"                   , 0x02C977 }, +	{ "Europe/Busingen"                   , 0x02CCE0 }, +	{ "Europe/Chisinau"                   , 0x02CF97 }, +	{ "Europe/Copenhagen"                 , 0x02D325 }, +	{ "Europe/Dublin"                     , 0x02D62F }, +	{ "Europe/Gibraltar"                  , 0x02DB40 }, +	{ "Europe/Guernsey"                   , 0x02DF97 }, +	{ "Europe/Helsinki"                   , 0x02E4CE }, +	{ "Europe/Isle_of_Man"                , 0x02E784 }, +	{ "Europe/Istanbul"                   , 0x02ECBB }, +	{ "Europe/Jersey"                     , 0x02F0A8 }, +	{ "Europe/Kaliningrad"                , 0x02F5DF }, +	{ "Europe/Kiev"                       , 0x02F84A }, +	{ "Europe/Lisbon"                     , 0x02FB66 }, +	{ "Europe/Ljubljana"                  , 0x03006A }, +	{ "Europe/London"                     , 0x030333 }, +	{ "Europe/Luxembourg"                 , 0x03086A }, +	{ "Europe/Madrid"                     , 0x030CC0 }, +	{ "Europe/Malta"                      , 0x031086 }, +	{ "Europe/Mariehamn"                  , 0x03143F }, +	{ "Europe/Minsk"                      , 0x0316F5 }, +	{ "Europe/Monaco"                     , 0x031903 }, +	{ "Europe/Moscow"                     , 0x031D3E }, +	{ "Europe/Nicosia"                    , 0x031F98 }, +	{ "Europe/Oslo"                       , 0x032280 }, +	{ "Europe/Paris"                      , 0x0325B2 }, +	{ "Europe/Podgorica"                  , 0x0329F8 }, +	{ "Europe/Prague"                     , 0x032CC1 }, +	{ "Europe/Riga"                       , 0x032FF3 }, +	{ "Europe/Rome"                       , 0x033338 }, +	{ "Europe/Samara"                     , 0x0336FB }, +	{ "Europe/San_Marino"                 , 0x033964 }, +	{ "Europe/Sarajevo"                   , 0x033D27 }, +	{ "Europe/Simferopol"                 , 0x033FF0 }, +	{ "Europe/Skopje"                     , 0x034241 }, +	{ "Europe/Sofia"                      , 0x03450A }, +	{ "Europe/Stockholm"                  , 0x034812 }, +	{ "Europe/Tallinn"                    , 0x034AC1 }, +	{ "Europe/Tirane"                     , 0x034DFB }, +	{ "Europe/Tiraspol"                   , 0x035101 }, +	{ "Europe/Uzhgorod"                   , 0x03548F }, +	{ "Europe/Vaduz"                      , 0x0357A6 }, +	{ "Europe/Vatican"                    , 0x035A55 }, +	{ "Europe/Vienna"                     , 0x035E18 }, +	{ "Europe/Vilnius"                    , 0x036145 }, +	{ "Europe/Volgograd"                  , 0x036484 }, +	{ "Europe/Warsaw"                     , 0x0366A5 }, +	{ "Europe/Zagreb"                     , 0x036A86 }, +	{ "Europe/Zaporozhye"                 , 0x036D4F }, +	{ "Europe/Zurich"                     , 0x037090 }, +	{ "Factory"                           , 0x03733F }, +	{ "GB"                                , 0x0373B0 }, +	{ "GB-Eire"                           , 0x0378E7 }, +	{ "GMT"                               , 0x037E1E }, +	{ "GMT+0"                             , 0x037EEA }, +	{ "GMT-0"                             , 0x037EA6 }, +	{ "GMT0"                              , 0x037E62 }, +	{ "Greenwich"                         , 0x037F2E }, +	{ "Hongkong"                          , 0x037F72 }, +	{ "HST"                               , 0x038134 }, +	{ "Iceland"                           , 0x038178 }, +	{ "Indian/Antananarivo"               , 0x038331 }, +	{ "Indian/Chagos"                     , 0x0383A5 }, +	{ "Indian/Christmas"                  , 0x038407 }, +	{ "Indian/Cocos"                      , 0x03844B }, +	{ "Indian/Comoro"                     , 0x03848F }, +	{ "Indian/Kerguelen"                  , 0x0384E4 }, +	{ "Indian/Mahe"                       , 0x038539 }, +	{ "Indian/Maldives"                   , 0x03858E }, +	{ "Indian/Mauritius"                  , 0x0385E3 }, +	{ "Indian/Mayotte"                    , 0x038659 }, +	{ "Indian/Reunion"                    , 0x0386AE }, +	{ "Iran"                              , 0x038703 }, +	{ "Israel"                            , 0x038971 }, +	{ "Jamaica"                           , 0x038CA0 }, +	{ "Japan"                             , 0x038D65 }, +	{ "Kwajalein"                         , 0x038DEF }, +	{ "Libya"                             , 0x038E52 }, +	{ "MET"                               , 0x038F5B }, +	{ "Mexico/BajaNorte"                  , 0x039264 }, +	{ "Mexico/BajaSur"                    , 0x0395CD }, +	{ "Mexico/General"                    , 0x039812 }, +	{ "MST"                               , 0x039A70 }, +	{ "MST7MDT"                           , 0x039AB4 }, +	{ "Navajo"                            , 0x039E05 }, +	{ "NZ"                                , 0x03A17E }, +	{ "NZ-CHAT"                           , 0x03A4FC }, +	{ "Pacific/Apia"                      , 0x03A7E0 }, +	{ "Pacific/Auckland"                  , 0x03A97C }, +	{ "Pacific/Chatham"                   , 0x03AD08 }, +	{ "Pacific/Chuuk"                     , 0x03AFFB }, +	{ "Pacific/Easter"                    , 0x03B054 }, +	{ "Pacific/Efate"                     , 0x03B3A3 }, +	{ "Pacific/Enderbury"                 , 0x03B469 }, +	{ "Pacific/Fakaofo"                   , 0x03B4D7 }, +	{ "Pacific/Fiji"                      , 0x03B528 }, +	{ "Pacific/Funafuti"                  , 0x03B6BB }, +	{ "Pacific/Galapagos"                 , 0x03B6FF }, +	{ "Pacific/Gambier"                   , 0x03B777 }, +	{ "Pacific/Guadalcanal"               , 0x03B7DC }, +	{ "Pacific/Guam"                      , 0x03B831 }, +	{ "Pacific/Honolulu"                  , 0x03B887 }, +	{ "Pacific/Johnston"                  , 0x03B8FE }, +	{ "Pacific/Kiritimati"                , 0x03B97D }, +	{ "Pacific/Kosrae"                    , 0x03B9E8 }, +	{ "Pacific/Kwajalein"                 , 0x03BA45 }, +	{ "Pacific/Majuro"                    , 0x03BAB1 }, +	{ "Pacific/Marquesas"                 , 0x03BB10 }, +	{ "Pacific/Midway"                    , 0x03BB77 }, +	{ "Pacific/Nauru"                     , 0x03BC01 }, +	{ "Pacific/Niue"                      , 0x03BC79 }, +	{ "Pacific/Norfolk"                   , 0x03BCD7 }, +	{ "Pacific/Noumea"                    , 0x03BD2C }, +	{ "Pacific/Pago_Pago"                 , 0x03BDBC }, +	{ "Pacific/Palau"                     , 0x03BE33 }, +	{ "Pacific/Pitcairn"                  , 0x03BE77 }, +	{ "Pacific/Pohnpei"                   , 0x03BECC }, +	{ "Pacific/Ponape"                    , 0x03BF21 }, +	{ "Pacific/Port_Moresby"              , 0x03BF66 }, +	{ "Pacific/Rarotonga"                 , 0x03BFAA }, +	{ "Pacific/Saipan"                    , 0x03C086 }, +	{ "Pacific/Samoa"                     , 0x03C0E9 }, +	{ "Pacific/Tahiti"                    , 0x03C160 }, +	{ "Pacific/Tarawa"                    , 0x03C1C5 }, +	{ "Pacific/Tongatapu"                 , 0x03C219 }, +	{ "Pacific/Truk"                      , 0x03C2A5 }, +	{ "Pacific/Wake"                      , 0x03C2EA }, +	{ "Pacific/Wallis"                    , 0x03C33A }, +	{ "Pacific/Yap"                       , 0x03C37E }, +	{ "Poland"                            , 0x03C3C3 }, +	{ "Portugal"                          , 0x03C7A4 }, +	{ "PRC"                               , 0x03CCA0 }, +	{ "PST8PDT"                           , 0x03CD40 }, +	{ "ROC"                               , 0x03D091 }, +	{ "ROK"                               , 0x03D1C2 }, +	{ "Singapore"                         , 0x03D289 }, +	{ "Turkey"                            , 0x03D340 }, +	{ "UCT"                               , 0x03D72D }, +	{ "Universal"                         , 0x03D771 }, +	{ "US/Alaska"                         , 0x03D7B5 }, +	{ "US/Aleutian"                       , 0x03DB1E }, +	{ "US/Arizona"                        , 0x03DE84 }, +	{ "US/Central"                        , 0x03DF12 }, +	{ "US/East-Indiana"                   , 0x03E91C }, +	{ "US/Eastern"                        , 0x03E41D }, +	{ "US/Hawaii"                         , 0x03EB86 }, +	{ "US/Indiana-Starke"                 , 0x03EBF7 }, +	{ "US/Michigan"                       , 0x03EF68 }, +	{ "US/Mountain"                       , 0x03F29F }, +	{ "US/Pacific"                        , 0x03F618 }, +	{ "US/Pacific-New"                    , 0x03FA1D }, +	{ "US/Samoa"                          , 0x03FE22 }, +	{ "UTC"                               , 0x03FE99 }, +	{ "W-SU"                              , 0x040190 }, +	{ "WET"                               , 0x03FEDD }, +	{ "Zulu"                              , 0x0403D3 },  };  /* This is a generated file, do not modify */ -const unsigned char timelib_timezone_db_data_builtin[263151] = { +const unsigned char timelib_timezone_db_data_builtin[263191] = {  /* Africa/Abidjan */ @@ -698,8 +698,8 @@ const unsigned char timelib_timezone_db_data_builtin[263151] = {  /* Africa/Blantyre */  0x50, 0x48, 0x50, 0x31, 0x01, 0x4D, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x82, 0x46, 0xC3, 0xB0,  -0x01, 0x00, 0x00, 0x20, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x04, 0x4C, 0x4D, 0x54,  +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x82, 0x46, 0xC5, 0xF4,  +0x01, 0x00, 0x00, 0x1E, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x04, 0x4C, 0x4D, 0x54,   0x00, 0x43, 0x41, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x3E, 0xE2, 0x01, 0x48, 0x10,   0x60, 0x00, 0x00, 0x00, 0x00,  @@ -713,10 +713,11 @@ const unsigned char timelib_timezone_db_data_builtin[263151] = {  /* Africa/Bujumbura */  0x50, 0x48, 0x50, 0x31, 0x01, 0x42, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20,  -0x00, 0x00, 0x43, 0x41, 0x54, 0x00, 0x00, 0x00, 0x00, 0x84, 0x2A, 0xA2, 0x01, 0x3F, 0x77, 0xDA,  -0x00, 0x00, 0x00, 0x00,  +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,  +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x82, 0x46, 0xC5, 0xF4,  +0x01, 0x00, 0x00, 0x1E, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x04, 0x4C, 0x4D, 0x54,  +0x00, 0x43, 0x41, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x2A, 0xA2, 0x01, 0x3F, 0x77,  +0xDA, 0x00, 0x00, 0x00, 0x00,   /* Africa/Cairo */  0x50, 0x48, 0x50, 0x31, 0x01, 0x45, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  @@ -963,18 +964,17 @@ const unsigned char timelib_timezone_db_data_builtin[263151] = {  /* Africa/Gaborone */  0x50, 0x48, 0x50, 0x31, 0x01, 0x42, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0E, 0x82, 0x46, 0xCF, 0x68,  -0xCE, 0x8E, 0x6E, 0x80, 0xCF, 0x7E, 0x51, 0x70, 0x01, 0x02, 0x01, 0x00, 0x00, 0x15, 0x18, 0x00,  -0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x05, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x09, 0x53, 0x41, 0x53,  -0x54, 0x00, 0x43, 0x41, 0x54, 0x00, 0x43, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x63, 0xB7, 0x57, 0x01, 0x3A, 0x34, 0x32, 0x00, 0x00, 0x00, 0x00,  +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,  +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x82, 0x46, 0xC5, 0xF4,  +0x01, 0x00, 0x00, 0x1E, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x04, 0x4C, 0x4D, 0x54,  +0x00, 0x43, 0x41, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0xB7, 0x57, 0x01, 0x3A, 0x34,  +0x32, 0x00, 0x00, 0x00, 0x00,   /* Africa/Harare */  0x50, 0x48, 0x50, 0x31, 0x01, 0x5A, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x82, 0x46, 0xC7, 0x64,  -0x01, 0x00, 0x00, 0x1D, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x04, 0x4C, 0x4D, 0x54,  +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x82, 0x46, 0xC5, 0xF4,  +0x01, 0x00, 0x00, 0x1E, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x04, 0x4C, 0x4D, 0x54,   0x00, 0x43, 0x41, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x1E, 0x1A, 0x01, 0x42, 0x09,   0x68, 0x00, 0x00, 0x00, 0x00,  @@ -1040,8 +1040,8 @@ const unsigned char timelib_timezone_db_data_builtin[263151] = {  /* Africa/Kigali */  0x50, 0x48, 0x50, 0x31, 0x01, 0x52, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0xBE, 0xF1, 0x0E, 0x50,  -0x01, 0x00, 0x00, 0x1C, 0x30, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x04, 0x4C, 0x4D, 0x54,  +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x82, 0x46, 0xC5, 0xF4,  +0x01, 0x00, 0x00, 0x1E, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x04, 0x4C, 0x4D, 0x54,   0x00, 0x43, 0x41, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x5A, 0x88, 0x01, 0x40, 0x89,   0x4A, 0x00, 0x00, 0x00, 0x00,  @@ -1088,17 +1088,18 @@ const unsigned char timelib_timezone_db_data_builtin[263151] = {  /* Africa/Lubumbashi */  0x50, 0x48, 0x50, 0x31, 0x01, 0x43, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x1C, 0x20,  -0x00, 0x00, 0x43, 0x41, 0x54, 0x00, 0x00, 0x00, 0x00, 0x77, 0x86, 0xF5, 0x01, 0x3C, 0x91, 0xAA,  -0x00, 0x00, 0x00, 0x17, 0x65, 0x61, 0x73, 0x74, 0x20, 0x44, 0x65, 0x6D, 0x2E, 0x20, 0x52, 0x65,  -0x70, 0x2E, 0x20, 0x6F, 0x66, 0x20, 0x43, 0x6F, 0x6E, 0x67, 0x6F,  +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,  +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x82, 0x46, 0xC5, 0xF4,  +0x01, 0x00, 0x00, 0x1E, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x04, 0x4C, 0x4D, 0x54,  +0x00, 0x43, 0x41, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x86, 0xF5, 0x01, 0x3C, 0x91,  +0xAA, 0x00, 0x00, 0x00, 0x17, 0x65, 0x61, 0x73, 0x74, 0x20, 0x44, 0x65, 0x6D, 0x2E, 0x20, 0x52,  +0x65, 0x70, 0x2E, 0x20, 0x6F, 0x66, 0x20, 0x43, 0x6F, 0x6E, 0x67, 0x6F,   /* Africa/Lusaka */  0x50, 0x48, 0x50, 0x31, 0x01, 0x5A, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x82, 0x46, 0xC9, 0xFC,  -0x01, 0x00, 0x00, 0x1A, 0x84, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x04, 0x4C, 0x4D, 0x54,  +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x82, 0x46, 0xC5, 0xF4,  +0x01, 0x00, 0x00, 0x1E, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x04, 0x4C, 0x4D, 0x54,   0x00, 0x43, 0x41, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0xCE, 0x1D, 0x01, 0x3D, 0xD0,   0xAD, 0x00, 0x00, 0x00, 0x00,  @@ -1121,19 +1122,20 @@ const unsigned char timelib_timezone_db_data_builtin[263151] = {  /* Africa/Maseru */  0x50, 0x48, 0x50, 0x31, 0x01, 0x4C, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x82, 0x46, 0xCA, 0xB8,  -0xCE, 0x8E, 0x6E, 0x80, 0xCF, 0x7E, 0x51, 0x70, 0x01, 0x02, 0x01, 0x00, 0x00, 0x19, 0xC8, 0x00,  -0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x04, 0x00, 0x00, 0x2A, 0x30, 0x01, 0x04, 0x4C, 0x4D, 0x54,  -0x00, 0x53, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x5D, 0xD5,  -0x01, 0x3C, 0x9E, 0xB0, 0x00, 0x00, 0x00, 0x00,  +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x82, 0x46, 0xCF, 0x68,  +0xCC, 0xAE, 0x8C, 0x80, 0xCD, 0x9E, 0x6F, 0x70, 0xCE, 0x8E, 0x6E, 0x80, 0xCF, 0x7E, 0x51, 0x70,  +0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x15, 0x18, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01,  +0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x00, 0x53, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00,  +0x00, 0x00, 0x00, 0x5C, 0x5D, 0xD5, 0x01, 0x3C, 0x9E, 0xB0, 0x00, 0x00, 0x00, 0x00,   /* Africa/Mbabane */  0x50, 0x48, 0x50, 0x31, 0x01, 0x53, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x82, 0x46, 0xC7, 0x58,  -0x01, 0x00, 0x00, 0x1D, 0x28, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x04, 0x4C, 0x4D, 0x54,  -0x00, 0x53, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x32, 0xD0, 0x01, 0x42,  -0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00,  +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,  +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x82, 0x46, 0xCF, 0x68,  +0xCC, 0xAE, 0x8C, 0x80, 0xCD, 0x9E, 0x6F, 0x70, 0xCE, 0x8E, 0x6E, 0x80, 0xCF, 0x7E, 0x51, 0x70,  +0x02, 0x01, 0x02, 0x01, 0x02, 0x00, 0x00, 0x15, 0x18, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x30, 0x01,  +0x00, 0x00, 0x00, 0x1C, 0x20, 0x00, 0x00, 0x53, 0x41, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00,  +0x00, 0x00, 0x00, 0x61, 0x32, 0xD0, 0x01, 0x42, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00,   /* Africa/Mogadishu */  0x50, 0x48, 0x50, 0x31, 0x01, 0x53, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  @@ -4056,7 +4058,7 @@ const unsigned char timelib_timezone_db_data_builtin[263151] = {  0x50, 0x48, 0x50, 0x31, 0x01, 0x4A, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB4, 0xFF,  -0x08, 0x20, 0xC1, 0x70, 0x09, 0x10, 0xA4, 0x60, 0x09, 0xAD, 0x94, 0xF0, 0x0A, 0xF0, 0x86, 0x60,  +0x07, 0x8D, 0x19, 0x70, 0x09, 0x10, 0xA4, 0x60, 0x09, 0xAD, 0x94, 0xF0, 0x0A, 0xF0, 0x86, 0x60,   0x0B, 0xE0, 0x85, 0x70, 0x0C, 0xD9, 0xA2, 0xE0, 0x0D, 0xC0, 0x67, 0x70, 0x0E, 0xB9, 0x84, 0xE0,   0x0F, 0xA9, 0x83, 0xF0, 0x10, 0x99, 0x66, 0xE0, 0x11, 0x89, 0x65, 0xF0, 0x12, 0x79, 0x48, 0xE0,   0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, 0x15, 0x49, 0x29, 0xF0, 0x16, 0x39, 0x0C, 0xE0,  @@ -8909,7 +8911,7 @@ const unsigned char timelib_timezone_db_data_builtin[263151] = {  /* Asia/Novokuznetsk */  0x50, 0x48, 0x50, 0x31, 0x01, 0x52, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00,  -0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x1A, 0xA1, 0xF9, 0x13, 0x40,  +0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x1A, 0xAA, 0x18, 0x20, 0xC0,   0xB5, 0xA3, 0xE1, 0x20, 0x15, 0x27, 0x6F, 0x90, 0x16, 0x18, 0xA4, 0x00, 0x17, 0x08, 0xA3, 0x10,   0x17, 0xF9, 0xD7, 0x80, 0x18, 0xE9, 0xD6, 0x90, 0x19, 0xDB, 0x0B, 0x00, 0x1A, 0xCC, 0x5B, 0x90,   0x1B, 0xBC, 0x68, 0xB0, 0x1C, 0xAC, 0x59, 0xB0, 0x1D, 0x9C, 0x4A, 0xB0, 0x1E, 0x8C, 0x3B, 0xB0,  @@ -8934,7 +8936,7 @@ const unsigned char timelib_timezone_db_data_builtin[263151] = {  0x80, 0x01, 0x09, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x00, 0x00, 0x62, 0x70, 0x00, 0x04, 0x00,   0x00, 0x70, 0x80, 0x01, 0x09, 0x00, 0x00, 0x62, 0x70, 0x01, 0x09, 0x00, 0x00, 0x54, 0x60, 0x00,   0x04, 0x00, 0x00, 0x62, 0x70, 0x01, 0x0F, 0x00, 0x00, 0x54, 0x60, 0x00, 0x15, 0x00, 0x00, 0x62,  -0x70, 0x00, 0x15, 0x4E, 0x4D, 0x54, 0x00, 0x4B, 0x52, 0x41, 0x54, 0x00, 0x4B, 0x52, 0x41, 0x53,  +0x70, 0x00, 0x15, 0x4C, 0x4D, 0x54, 0x00, 0x4B, 0x52, 0x41, 0x54, 0x00, 0x4B, 0x52, 0x41, 0x53,   0x54, 0x00, 0x4E, 0x4F, 0x56, 0x53, 0x54, 0x00, 0x4E, 0x4F, 0x56, 0x54, 0x00, 0x00, 0x00, 0x00,   0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0xDB, 0x58, 0x58, 0x01, 0x97, 0x96, 0x72, 0x00, 0x00, 0x00, 0x31, 0x4D,  @@ -16412,7 +16414,7 @@ const unsigned char timelib_timezone_db_data_builtin[263151] = {  0x50, 0x48, 0x50, 0x31, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,   0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x93, 0x0F, 0xB4, 0xFF,  -0x08, 0x20, 0xC1, 0x70, 0x09, 0x10, 0xA4, 0x60, 0x09, 0xAD, 0x94, 0xF0, 0x0A, 0xF0, 0x86, 0x60,  +0x07, 0x8D, 0x19, 0x70, 0x09, 0x10, 0xA4, 0x60, 0x09, 0xAD, 0x94, 0xF0, 0x0A, 0xF0, 0x86, 0x60,   0x0B, 0xE0, 0x85, 0x70, 0x0C, 0xD9, 0xA2, 0xE0, 0x0D, 0xC0, 0x67, 0x70, 0x0E, 0xB9, 0x84, 0xE0,   0x0F, 0xA9, 0x83, 0xF0, 0x10, 0x99, 0x66, 0xE0, 0x11, 0x89, 0x65, 0xF0, 0x12, 0x79, 0x48, 0xE0,   0x13, 0x69, 0x47, 0xF0, 0x14, 0x59, 0x2A, 0xE0, 0x15, 0x49, 0x29, 0xF0, 0x16, 0x39, 0x0C, 0xE0,  @@ -18530,4 +18532,4 @@ const unsigned char timelib_timezone_db_data_builtin[263151] = {  0x00, 0x00, 0x55, 0x54, 0x43, 0x00, 0x00, 0x00, 0x00, 0x89, 0x54, 0x40, 0x01, 0x12, 0xA8, 0x80,   0x00, 0x00, 0x00, 0x00, }; -const timelib_tzdb timezonedb_builtin = { "2014.7", 582, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; +const timelib_tzdb timezonedb_builtin = { "2014.8", 582, timezonedb_idx_builtin, timelib_timezone_db_data_builtin }; diff --git a/ext/ext_skel b/ext/ext_skel index e6b01fd4fc..c0c398d15e 100755 --- a/ext/ext_skel +++ b/ext/ext_skel @@ -156,12 +156,12 @@ if test "\$PHP_$EXTNAME" != "no"; then    dnl PHP_CHECK_LIBRARY(\$LIBNAME,\$LIBSYMBOL,    dnl [ -  dnl   PHP_ADD_LIBRARY_WITH_PATH(\$LIBNAME, \$${EXTNAME}_DIR/lib, ${EXTNAME}_SHARED_LIBADD) +  dnl   PHP_ADD_LIBRARY_WITH_PATH(\$LIBNAME, \$${EXTNAME}_DIR/\$PHP_LIBDIR, ${EXTNAME}_SHARED_LIBADD)    dnl   AC_DEFINE(HAVE_${EXTNAME}LIB,1,[ ])    dnl ],[    dnl   AC_MSG_ERROR([wrong $extname lib version or lib not found])    dnl ],[ -  dnl   -L\$${EXTNAME}_DIR/lib -lm +  dnl   -L\$${EXTNAME}_DIR/\$PHP_LIBDIR -lm    dnl ])    dnl    dnl PHP_SUBST(${EXTNAME}_SHARED_LIBADD) diff --git a/ext/fileinfo/libmagic/apprentice.c b/ext/fileinfo/libmagic/apprentice.c index ce747378aa..543bce5088 100644 --- a/ext/fileinfo/libmagic/apprentice.c +++ b/ext/fileinfo/libmagic/apprentice.c @@ -1272,7 +1272,7 @@ file_signextend(struct magic_set *ms, struct magic *m, uint64_t v)  		 * the sign extension must have happened.  		 */  		case FILE_BYTE: -			v = (char) v; +			v = (signed char) v;  			break;  		case FILE_SHORT:  		case FILE_BESHORT: diff --git a/ext/gd/tests/bug48801_1.phpt b/ext/gd/tests/bug48801_1.phpt index ef2aa1dba7..0ab6d7cdd9 100644 --- a/ext/gd/tests/bug48801_1.phpt +++ b/ext/gd/tests/bug48801_1.phpt @@ -1,13 +1,12 @@  --TEST-- -Bug #48801 (Problem with imagettfbbox) freetype >= 2.4.10 and < 2.4.12 +Bug #48801 (Problem with imagettfbbox) freetype >= 2.4.10  --SKIPIF--  <?php  	if(!extension_loaded('gd')){ die('skip gd extension not available'); }  	if(!function_exists('imageftbbox')) die('skip imageftbbox() not available');  	include dirname(__FILE__) . '/func.inc'; -	if(version_compare(get_freetype_version(), '2.4.10') < 0) die('skip for freetype >= 2.4.10'); -	if(version_compare(get_freetype_version(), '2.4.12') >= 0) die('skip for freetype < 2.4.12'); +	if(version_compare(get_freetype_version(), '2.4.10') == -1) die('skip for freetype >= 2.4.10');  ?>  --FILE--  <?php @@ -21,6 +20,6 @@ echo '(' . $bbox[6] . ', ' . $bbox[7] . ")\n";  ?>  --EXPECTF--  (-1, 15) -(156, 15) -(156, -48) +(15%d, 15) +(15%d, -48)  (-1, -48) diff --git a/ext/gd/tests/bug48801_2.phpt b/ext/gd/tests/bug48801_2.phpt deleted file mode 100644 index b2a719fa02..0000000000 --- a/ext/gd/tests/bug48801_2.phpt +++ /dev/null @@ -1,25 +0,0 @@ ---TEST-- -Bug #48801 (Problem with imagettfbbox) freetype >= 2.4.12 ---SKIPIF-- -<?php -	if(!extension_loaded('gd')){ die('skip gd extension not available'); } -	if(!function_exists('imageftbbox')) die('skip imageftbbox() not available'); - -	include dirname(__FILE__) . '/func.inc'; -	if(version_compare(get_freetype_version(), '2.4.12') < 0) die('skip for freetype >= 2.4.12'); -?> ---FILE-- -<?php -$cwd = dirname(__FILE__); -$font = "$cwd/Tuffy.ttf"; -$bbox = imageftbbox(50, 0, $font, "image"); -echo '(' . $bbox[0] . ', ' . $bbox[1] . ")\n"; -echo '(' . $bbox[2] . ', ' . $bbox[3] . ")\n"; -echo '(' . $bbox[4] . ', ' . $bbox[5] . ")\n"; -echo '(' . $bbox[6] . ', ' . $bbox[7] . ")\n"; -?> ---EXPECTF-- -(-1, 15) -(155, 15) -(155, -48) -(-1, -48) diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 50055a25a7..8a141c0066 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -391,6 +391,23 @@ static int _get_lderrno(LDAP *ldap)  }  /* }}} */ +/* {{{ _set_lderrno + */ +static void _set_lderrno(LDAP *ldap, int lderr) +{ +#if !HAVE_NSLDAP +#if LDAP_API_VERSION > 2000 || HAVE_ORALDAP +	/* New versions of OpenLDAP do it this way */ +	ldap_set_option(ldap, LDAP_OPT_ERROR_NUMBER, &lderr); +#else +	ldap->ld_errno = lderr; +#endif +#else +	ldap_set_lderrno(ldap, lderr, NULL, NULL); +#endif +} +/* }}} */ +  /* {{{ proto bool ldap_bind(resource link [, string dn [, string password]])     Bind to LDAP directory */  PHP_FUNCTION(ldap_bind) @@ -405,18 +422,20 @@ PHP_FUNCTION(ldap_bind)  		RETURN_FALSE;  	} +	ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, &link, -1, "ldap link", le_link); +  	if (ldap_bind_dn != NULL && memchr(ldap_bind_dn, '\0', ldap_bind_dnlen) != NULL) { +		_set_lderrno(ld->link, LDAP_INVALID_CREDENTIALS);  		php_error_docref(NULL TSRMLS_CC, E_WARNING, "DN contains a null byte");  		RETURN_FALSE;  	}  	if (ldap_bind_pw != NULL && memchr(ldap_bind_pw, '\0', ldap_bind_pwlen) != NULL) { +		_set_lderrno(ld->link, LDAP_INVALID_CREDENTIALS);  		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Password contains a null byte");  		RETURN_FALSE;  	} -	ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, &link, -1, "ldap link", le_link); -  	if ((rc = ldap_bind_s(ld->link, ldap_bind_dn, ldap_bind_pw, LDAP_AUTH_SIMPLE)) != LDAP_SUCCESS) {  		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to bind to server: %s", ldap_err2string(rc));  		RETURN_FALSE; diff --git a/ext/mysqlnd/mysqlnd_ps_codec.c b/ext/mysqlnd/mysqlnd_ps_codec.c index 3ff0019c00..3af19cbc95 100644 --- a/ext/mysqlnd/mysqlnd_ps_codec.c +++ b/ext/mysqlnd/mysqlnd_ps_codec.c @@ -200,17 +200,27 @@ ps_fetch_float(zval * zv, const MYSQLND_FIELD * const field, unsigned int pack_l  		/* The following cast is guaranteed to do the right thing */  		dval = (double) d32val;  	} +#elif defined(PHP_WIN32) +	{ +		/* float datatype on Winows is already 4 byte but has a precision of 7 digits */ +		char num_buf[2048]; +		(void)_gcvt_s(num_buf, 2048, fval, field->decimals >= 31 ? 7 : field->decimals); +		dval = zend_strtod(num_buf, NULL); +	}  #else  	{  		char num_buf[2048]; /* Over allocated */  		char *s; +#ifndef FLT_DIG +# define FLT_DIG 6 +#endif  		/* Convert to string. Ignoring localization, etc.  		 * Following MySQL's rules. If precision is undefined (NOT_FIXED_DEC i.e. 31)  		 * or larger than 31, the value is limited to 6 (FLT_DIG).  		 */  		s = php_gcvt(fval, -			     field->decimals >= 31 ? 6 : field->decimals, +			     field->decimals >= 31 ? FLT_DIG : field->decimals,  			     '.',  			     'e',  			     num_buf); diff --git a/ext/openssl/config0.m4 b/ext/openssl/config0.m4 index a97114f808..701e488385 100644 --- a/ext/openssl/config0.m4 +++ b/ext/openssl/config0.m4 @@ -8,6 +8,9 @@ PHP_ARG_WITH(openssl, for OpenSSL support,  PHP_ARG_WITH(kerberos, for Kerberos support,  [  --with-kerberos[=DIR]     OPENSSL: Include Kerberos support], no, no) +PHP_ARG_WITH(system-ciphers, whether to use system default cipher list instead of hardcoded value, +[  --with-system-ciphers   OPENSSL: Use system default cipher list instead of hardcoded value], no, no) +  if test "$PHP_OPENSSL" != "no"; then    PHP_NEW_EXTENSION(openssl, openssl.c xp_ssl.c, $ext_shared)    PHP_SUBST(OPENSSL_SHARED_LIBADD) @@ -25,4 +28,7 @@ if test "$PHP_OPENSSL" != "no"; then    ], [      AC_MSG_ERROR([OpenSSL check failed. Please check config.log for more information.])    ]) +  if test "$PHP_SYSTEM_CIPHERS" != "no"; then +    AC_DEFINE(USE_OPENSSL_SYSTEM_CIPHERS,1,[ Use system default cipher list instead of hardcoded value ]) +  fi  fi diff --git a/ext/openssl/tests/bug65729.pem b/ext/openssl/tests/bug65729.pem index dbeed6efd3..f0d44a4c78 100644 --- a/ext/openssl/tests/bug65729.pem +++ b/ext/openssl/tests/bug65729.pem @@ -1,28 +1,28 @@  -----BEGIN CERTIFICATE----- -MIICCTCCAXICCQDNMI29sowT7TANBgkqhkiG9w0BAQUFADBJMQswCQYDVQQGEwJT +MIICCTCCAXICCQCx2JwIhbRefzANBgkqhkiG9w0BAQUFADBJMQswCQYDVQQGEwJT  RzESMBAGA1UECBMJVGVzdHZpbGxlMREwDwYDVQQKEwhkYXRpYmJhdzETMBEGA1UE -AxQKKi50ZXN0LmNvbTAeFw0xMzA5MjEwNzUyMjRaFw0xNDA5MjEwNzUyMjRaMEkx +AxQKKi50ZXN0LmNvbTAeFw0xNDA5MjQxMTMzNTRaFw0yNDA5MjExMTMzNTRaMEkx  CzAJBgNVBAYTAlNHMRIwEAYDVQQIEwlUZXN0dmlsbGUxETAPBgNVBAoTCGRhdGli  YmF3MRMwEQYDVQQDFAoqLnRlc3QuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQCdzVnic8K5W4SVbwVuqezcTjeqVLoQ91vVNZB0Jnsuz6q3DoK03oAd1jTe -Vd0k+MQDbXpHoc37lA4+8z/g5Bs0UXxNx+nkbFTE7Ba2/G24caI9/cOXZPG3UViD -rtqXKL6h5/umqRG9Dt5liF2MVP9XFAesVC7B8+Ca+PbPlQoYzwIDAQABMA0GCSqG -SIb3DQEBBQUAA4GBAAS07u/Ke+EhEHidz6CG3Qcr+zg483JKRgZFyGz+YUKyyKKy -fmLs7JieGJxYQjOmIpj/6X9Gnb2HjIPDnI6A+MV1emXDTnnmsgf2/lZGcthhpZn2 -rMbj9bI0iH6HwOVGtp4ZJA5fB7nj3J+gWNTCQzDDOxwX36d2LL9ua+UMnk/g +iQKBgQDBnR8DYzsN90kISI87kBvw40TQknS7/fuymWCmSrtRQLED8p2QL8PiYCZ8 +UdcFVsv+di7MJvUOzW6dRo2DCu8Rojx3ML8dAtPsQkDdaCXDnOvCTQCAqFmxa1A9 +c5kp0hbzCrucKGckb355A4NumFgX1fjQ705MfjGPgQef1ZtozQIDAQABMA0GCSqG +SIb3DQEBBQUAA4GBAGP07nJo0pI4FdsXuAHWr97XxV4EhHopFMw6svOZ3UtsRzmW +ScmmMdgd3c8ciVxOsztgnzvFq/nrUkw/3n/Xz/gtE7kZt9aS18SnCyyHPJcXmmUE +NsbyZ/7srIqCSrxUkP+N//nToqHxg1pqA/A8RzOOQUAp+UIVF6Zl/kkFNgt8  -----END CERTIFICATE-----  -----BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQCdzVnic8K5W4SVbwVuqezcTjeqVLoQ91vVNZB0Jnsuz6q3DoK0 -3oAd1jTeVd0k+MQDbXpHoc37lA4+8z/g5Bs0UXxNx+nkbFTE7Ba2/G24caI9/cOX -ZPG3UViDrtqXKL6h5/umqRG9Dt5liF2MVP9XFAesVC7B8+Ca+PbPlQoYzwIDAQAB -AoGAeyzTwKPDl5QMRejHQL57GOwlH1vLcXrjv+VzwHZZKQ0IoKM++5fCQYf29KXp -XPahaluGW2u9sWa8R/7wGcd0Q4RtquGzsgT3+AQsIc5KfIamyOyDaRVM/ymX3fWg -gHIU7OOzB+ihOU8sHyRIwfbk01/kmrBXLRj8E31sy3i3PIECQQDQQYE+aN7Acrdt -yN5CaqvbkiCGjRvASlemiTzPosgOtndyp21w1gakJwKYhYDk1N6A6Qb8REMZqM/U -wFypldV/AkEAwfq6NFuhpGL6hDA7MvlyY1KiZ0cHetPUX+PgdNqy2DA+1Sv4i7gm -Wd/uA651K7aPXuUaf9dKtPCmZwI4M6SEsQJBALW89HTqP7niYoDEEnITdPaghxHk -gptERUln6lGo1L1CLus3gSI/JHyMLo+7scgAnEwTD62GRKhX0Ubwt+ymfTECQAY5 -fHYnppU20+EgBxZIqOIFCc8UmWnYmE0Ha/Fz/x8u1SVUBuK84wYpSGL32yyu7ATY -hzQo/W229zABAzqtAdECQQCUdB7IBFpPnsfv/EUBFX7X/7zAc9JpACmu9It5ju8C -KIsMuz/02D+TQoJNjdAngBM+4AJDIaGFgTMIfaDMh5L7 +MIICXgIBAAKBgQDBnR8DYzsN90kISI87kBvw40TQknS7/fuymWCmSrtRQLED8p2Q +L8PiYCZ8UdcFVsv+di7MJvUOzW6dRo2DCu8Rojx3ML8dAtPsQkDdaCXDnOvCTQCA +qFmxa1A9c5kp0hbzCrucKGckb355A4NumFgX1fjQ705MfjGPgQef1ZtozQIDAQAB +AoGADAnkAsbpxh2JKf2xAkgcpKbNAZcJsSLCwsEstEpTSWMXXqJ4T53YtTu7SOGh +2BAkkQbyM/l8JVZ6uUbIx8wnPzqAuB2hEDQHKZVyftDyJh+54Uyz0xV0JdWGWrFh +A+uDt/Zncx2g+qlkQG5J5nHnrd9OAns89wJXpBWA6twlsuECQQD/HC4wxOJzh1XI +YSWHWQulOnlNgZ2zERfmJeRfJ0ncmDOV2ofxOFQ+dMJ36XghPaH52KdxqWI1yQaE +yesx8ygFAkEAwkoF4lBuYdsXucJNDYf8o9MlBvazoriH0y26B/YozJ7iAEFqVvcC +TN+iKDIyiRALwR6a3nzhyFYJ4xyzgSIAKQJBAMnw3seQMsnM6aTS8cgwPr2uifNG +lTT4ZPi0KhEAosFSYhNPh6j1NAq0lnQhhgyaIywJypJ4yNtWpChdRiamGpkCQQDB +iUExPpOmMLwCk7VzrCmS+6pftHIevpi2WU99zMy5f+969665MFb/QqniRpamh/Bd +kGIPDPFQQbyZmqaJFNh5AkEAzy0YVbUT3C/QvstPr5i7ztj7WiW/1zJMamFwY/ZS +1J7e7lqHgRICie5uv1Yvh3w/qmV/7lTLhmlQZd9SJMpXhg==  -----END RSA PRIVATE KEY----- diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c index 1af8b12115..2f81dc7e47 100644 --- a/ext/openssl/xp_ssl.c +++ b/ext/openssl/xp_ssl.c @@ -1476,13 +1476,16 @@ int php_openssl_setup_crypto(php_stream *stream,  	}  	GET_VER_OPT_STRING("ciphers", cipherlist); +#ifndef USE_OPENSSL_SYSTEM_CIPHERS  	if (!cipherlist) {  		cipherlist = OPENSSL_DEFAULT_STREAM_CIPHERS;  	} -	if (SSL_CTX_set_cipher_list(sslsock->ctx, cipherlist) != 1) { -		return FAILURE; +#endif +	if (cipherlist) { +		if (SSL_CTX_set_cipher_list(sslsock->ctx, cipherlist) != 1) { +			return FAILURE; +		}  	} -  	if (FAILURE == set_local_cert(sslsock->ctx, stream TSRMLS_CC)) {  		return FAILURE;  	} @@ -1849,7 +1852,7 @@ static size_t php_openssl_sockop_read(php_stream *stream, char *buf, size_t coun  		   to hang forever. To avoid this scenario we poll with a timeout before performing  		   the actual read. If it times out we're finished.  		*/ -		if (sock->is_blocked) { +		if (sock->is_blocked && SSL_pending(sslsock->ssl_handle) == 0) {  			php_openssl_stream_wait_for_data(sock);  			if (sock->timeout_event) {  				stream->eof = 1; @@ -2176,17 +2179,19 @@ static int php_openssl_sockop_cast(php_stream *stream, int castas, void **ret TS  		case PHP_STREAM_AS_FD_FOR_SELECT:  			if (ret) { -				if (sslsock->ssl_active) { -					/* OpenSSL has an internal buffer which select() cannot see. If we don't -					   fetch it into the stream's buffer, no activity will be reported on the -					   stream even though there is data waiting to be read - but we only fetch -					   the number of bytes OpenSSL has ready to give us since we weren't asked -					   for any data at this stage. This is only likely to cause issues with -					   non-blocking streams, but it's harmless to always do it. */ -					int bytes; -					while ((bytes = SSL_pending(sslsock->ssl_handle)) > 0) { -						php_stream_fill_read_buffer(stream, (size_t)bytes); -					} +				/* OpenSSL has an internal buffer which select() cannot see. If we don't +				 * fetch it into the stream's buffer, no activity will be reported on the +				 * stream even though there is data waiting to be read - but we only fetch +				 * the lower of bytes OpenSSL has ready to give us or chunk_size since we +				 * weren't asked for any data at this stage. This is only likely to cause +				 * issues with non-blocking streams, but it's harmless to always do it. */ +				size_t pending; +				if (stream->writepos == stream->readpos +					&& sslsock->ssl_active +					&& (pending = (size_t)SSL_pending(sslsock->ssl_handle)) > 0) { +						php_stream_fill_read_buffer(stream, pending < stream->chunk_size +							? pending +							: stream->chunk_size);  				}  				*(php_socket_t *)ret = sslsock->s.socket; diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 8e5fcadef4..bdcea373a5 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -1015,9 +1015,12 @@ static int _extension_class_string(zend_class_entry **pce TSRMLS_DC, int num_arg  	int *num_classes = va_arg(args, int*);  	if (((*pce)->type == ZEND_INTERNAL_CLASS) && (*pce)->info.internal.module && !strcasecmp((*pce)->info.internal.module->name, module->name)) { -		string_printf(str, "\n"); -		_class_string(str, *pce, NULL, indent TSRMLS_CC); -		(*num_classes)++; +		/* dump class if it is not an alias */ +		if (!zend_binary_strcasecmp((*pce)->name, (*pce)->name_length, hash_key->arKey, hash_key->nKeyLength-1)) { +			string_printf(str, "\n"); +			_class_string(str, *pce, NULL, indent TSRMLS_CC); +			(*num_classes)++; +		}  	}  	return ZEND_HASH_APPLY_KEEP;  } @@ -5395,12 +5398,24 @@ static int add_extension_class(zend_class_entry **pce TSRMLS_DC, int num_args, v  	int add_reflection_class = va_arg(args, int);  	if (((*pce)->type == ZEND_INTERNAL_CLASS) && (*pce)->info.internal.module && !strcasecmp((*pce)->info.internal.module->name, module->name)) { +		const char *name; +		int nlen; + +		if (zend_binary_strcasecmp((*pce)->name, (*pce)->name_length, hash_key->arKey, hash_key->nKeyLength-1)) { +			/* This is an class alias, use alias name */ +			name = hash_key->arKey; +			nlen = hash_key->nKeyLength-1; +		} else { +			/* Use class name */ +			name = (*pce)->name; +			nlen = (*pce)->name_length; +		}  		if (add_reflection_class) {  			ALLOC_ZVAL(zclass);  			zend_reflection_class_factory(*pce, zclass TSRMLS_CC); -			add_assoc_zval_ex(class_array, (*pce)->name, (*pce)->name_length + 1, zclass); +			add_assoc_zval_ex(class_array, name, nlen+1, zclass);  		} else { -			add_next_index_stringl(class_array, (*pce)->name, (*pce)->name_length, 1); +			add_next_index_stringl(class_array, name, nlen, 1);  		}  	}  	return ZEND_HASH_APPLY_KEEP; diff --git a/ext/standard/image.c b/ext/standard/image.c index 02246c6268..f1910d2191 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -365,8 +365,8 @@ static unsigned short php_read2(php_stream * stream TSRMLS_DC)  {  	unsigned char a[2]; -	/* just return 0 if we hit the end-of-file */ -	if((php_stream_read(stream, a, sizeof(a))) <= 0) return 0; +	/* return 0 if we couldn't read enough data */ +	if((php_stream_read(stream, a, sizeof(a))) < sizeof(a)) return 0;  	return (((unsigned short)a[0]) << 8) + ((unsigned short)a[1]);  } @@ -646,7 +646,7 @@ static struct gfxinfo *php_handle_jpc(php_stream * stream TSRMLS_DC)  #endif  	result->channels = php_read2(stream TSRMLS_CC); /* Csiz */ -	if (result->channels < 0 || result->channels > 256) { +	if (result->channels == 0 && php_stream_eof(stream) || result->channels > 256) {  		efree(result);  		return NULL;  	} diff --git a/ext/standard/tests/streams/proc_open_bug51800.phpt b/ext/standard/tests/streams/proc_open_bug51800.phpt new file mode 100644 index 0000000000..53cafd8555 --- /dev/null +++ b/ext/standard/tests/streams/proc_open_bug51800.phpt @@ -0,0 +1,95 @@ +--TEST-- +Bug #51800 proc_open on Windows hangs forever +--SKIPIF-- +<?php +	echo 'skip expected to fail or take too long'; +	if (getenv("SKIP_SLOW_TESTS")) { +		die("skip slow test"); +	} +?> +--XFAIL-- +pipes have to be read/written simultaneously +--FILE-- +<?php +/* This is the wrong way to do it. The parent will block till it has read all the STDIN. +The smaller the pipe buffer is, the longer it will take. It might even pass at the end, +after taking inappropriately long. Pipes have to be read simultaneously in smaller chunks, +so then the pipe buffer is emptied more often and the child has chance to continue its +write. The behaviour might look some better if write/read in a separate thread, however +this is much more resource greedy and complexer to integrate into the user script. */ + +$callee = dirname(__FILE__) . "/process_proc_open_bug51800.php"; +$php = PHP_BINARY; +$cmd = "$php $callee"; + +$status; +$stdout = ""; +$stderr = ""; +$pipes = array(); + +$descriptors = array( +        0 => array("pipe", "rb"),       // stdin +        1 => array("pipe", "wb"),       // stdout +        2 => array("pipe", "wb")                // stderr +        ); + +/* create the proc file */ +$r = file_put_contents($callee, '<?php + +$how_much = 10000; + +$data0 = str_repeat("a", $how_much); +$data1 = str_repeat("b", $how_much); +fwrite(STDOUT, $data0); +fwrite(STDERR, $data1); + +exit(0); +'); + +if (!$r) { +	die("couldn't create helper script '$callee'"); +} + +$process = proc_open($cmd, $descriptors, $pipes); + +if (is_resource($process)) +{ +        fclose($pipes[0]); + +	while (!feof($pipes[1])) +		$stdout .= fread($pipes[1], 1024); +	fclose($pipes[1]); + +	while (!feof($pipes[2])) +		$stderr .= fread($pipes[2], 1024); +	fclose($pipes[2]); + +        $status = proc_close($process); +} + +var_dump(array( +        "status" => $status, +        "stdout" => $stdout, +        "stderr" => $stderr, +), strlen($stdout), strlen($stderr)); + +?> +===DONE=== +--CLEAN-- +<?php +$callee = dirname(__FILE__) . "/process_proc_open_bug51800.php"; +unlink($callee); +?> +--EXPECTF-- +array(3) { +  ["status"]=> +  int(0) +  ["stdout"]=> +  string(10000) "a%s" +  ["stderr"]=> +  string(10000) "b%s" +} +int(10000) +int(10000) +===DONE=== + diff --git a/ext/standard/tests/streams/proc_open_bug51800_right.phpt b/ext/standard/tests/streams/proc_open_bug51800_right.phpt new file mode 100644 index 0000000000..b14fed2e5d --- /dev/null +++ b/ext/standard/tests/streams/proc_open_bug51800_right.phpt @@ -0,0 +1,78 @@ +--TEST-- +Bug #51800 proc_open on Windows hangs forever, the right way to do it +--FILE-- +<?php +$callee = dirname(__FILE__) . "/process_proc_open_bug51800_right.php"; +$php = PHP_BINARY; +$cmd = "$php $callee"; + +$status; +$stdout = ""; +$stderr = ""; +$pipes = array(); + +$descriptors = array( +        0 => array("pipe", "rb"),       // stdin +        1 => array("pipe", "wb"),       // stdout +        2 => array("pipe", "wb")                // stderr +        ); + +/* create the proc file */ +$r = file_put_contents($callee, '<?php + +$how_much = 10000; + +$data0 = str_repeat("a", $how_much); +$data1 = str_repeat("b", $how_much); +fwrite(STDOUT, $data0); +fwrite(STDERR, $data1); + +exit(0); +'); + +if (!$r) { +	die("couldn't create helper script '$callee'"); +} + +$process = proc_open($cmd, $descriptors, $pipes); + +if (is_resource($process)) +{ +        fclose($pipes[0]); + +        while (!feof($pipes[1]) || !feof($pipes[2])) { +                $stdout .= fread($pipes[1], 1024); +                $stderr .= fread($pipes[2], 1024); +        } +        fclose($pipes[1]); +        fclose($pipes[2]); + +        $status = proc_close($process); +} + +var_dump(array( +        "status" => $status, +        "stdout" => $stdout, +        "stderr" => $stderr, +), strlen($stdout), strlen($stderr)); + +?> +===DONE=== +--CLEAN-- +<?php +$callee = dirname(__FILE__) . "/process_proc_open_bug51800_right.php"; +unlink($callee); +?> +--EXPECTF-- +array(3) { +  ["status"]=> +  int(0) +  ["stdout"]=> +  string(10000) "a%s" +  ["stderr"]=> +  string(10000) "b%s" +} +int(10000) +int(10000) +===DONE=== + diff --git a/ext/standard/tests/streams/proc_open_bug51800_right2.phpt b/ext/standard/tests/streams/proc_open_bug51800_right2.phpt new file mode 100644 index 0000000000..1e742745c1 --- /dev/null +++ b/ext/standard/tests/streams/proc_open_bug51800_right2.phpt @@ -0,0 +1,84 @@ +--TEST-- +Bug #51800 proc_open on Windows hangs forever, the right way to do it with more data +--FILE-- +<?php +$callee = dirname(__FILE__) . "/process_proc_open_bug51800_right2.php"; +$php = PHP_BINARY; +$cmd = "$php $callee"; + +$status; +$stdout = ""; +$stderr = ""; +$pipes = array(); + +$descriptors = array( +        0 => array("pipe", "rb"),       // stdin +        1 => array("pipe", "wb"),       // stdout +        2 => array("pipe", "wb")                // stderr +        ); + +/* create the proc file */ +$r = file_put_contents($callee, '<?php +$how_much = 1000000; + +$data0 = str_repeat("a", $how_much); +$data1 = str_repeat("b", $how_much); +$i0 = $i1 = 0; +$step = 1024; + +while ($i0 < strlen($data0) && $i1 < strlen($data1)) { +	fwrite(STDOUT, substr($data0, $i0, $step)); +	fwrite(STDERR, substr($data1, $i1, $step)); +	$i0 += $step; +	$i1 += $step; +} + +exit(0); +'); + +if (!$r) { +	die("couldn't create helper script '$callee'"); +} + +$process = proc_open($cmd, $descriptors, $pipes); + +if (is_resource($process)) +{ +        fclose($pipes[0]); + +        while (!feof($pipes[1]) || !feof($pipes[2])) { +                $stdout .= fread($pipes[1], 1024); +                $stderr .= fread($pipes[2], 1024); +        } +        fclose($pipes[1]); +        fclose($pipes[2]); + +        $status = proc_close($process); +} + +var_dump(array( +        "status" => $status, +        "stdout" => $stdout, +        "stderr" => $stderr, +), strlen($stdout), strlen($stderr)); + +?> +===DONE=== +--CLEAN-- +<?php +$callee = dirname(__FILE__) . "/process_proc_open_bug51800_right2.php"; +unlink($callee); +?> +--EXPECTF-- +array(3) { +  ["status"]=> +  int(0) +  ["stdout"]=> +  string(1000000) "a%s" +  ["stderr"]=> +  string(1000000) "b%s" +} +int(1000000) +int(1000000) +===DONE=== + diff --git a/ext/standard/tests/streams/proc_open_bug60120.phpt b/ext/standard/tests/streams/proc_open_bug60120.phpt new file mode 100644 index 0000000000..8768257a2e --- /dev/null +++ b/ext/standard/tests/streams/proc_open_bug60120.phpt @@ -0,0 +1,71 @@ +--TEST-- +Bug #60120 proc_open hangs with stdin/out with 2048+ bytes +--FILE-- +<?php +error_reporting(E_ALL); + +if (substr(PHP_OS, 0, 3) == 'WIN') { +	$cmd = PHP_BINARY . ' -n -r "fwrite(STDOUT, $in = file_get_contents(\'php://stdin\')); fwrite(STDERR, $in);"'; +} else { +	$cmd = PHP_BINARY . ' -n -r \'fwrite(STDOUT, $in = file_get_contents("php://stdin")); fwrite(STDERR, $in);\''; +} +$descriptors = array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w')); +$stdin = str_repeat('*', 1024 * 16) . '!'; +$stdin = str_repeat('*', 2049 ); + +$options = array_merge(array('suppress_errors' => true, 'binary_pipes' => true, 'bypass_shell' => false)); +$process = proc_open($cmd, $descriptors, $pipes, getcwd(), array(), $options); + +foreach ($pipes as $pipe) { +    stream_set_blocking($pipe, false); +} +$writePipes = array($pipes[0]); +$stdinLen = strlen($stdin); +$stdinOffset = 0; + +unset($pipes[0]); + +while ($pipes || $writePipes) { +    $r = $pipes; +    $w = $writePipes; +    $e = null; +    $n = stream_select($r, $w, $e, 60); + +    if (false === $n) { +        break; +    } elseif ($n === 0) { +        proc_terminate($process); + +    } +    if ($w) { +        $written = fwrite($writePipes[0], (binary)substr($stdin, $stdinOffset), 8192); +        if (false !== $written) { +            $stdinOffset += $written; +        } +        if ($stdinOffset >= $stdinLen) { +            fclose($writePipes[0]); +            $writePipes = null; +        } +    } + +    foreach ($r as $pipe) { +        $type = array_search($pipe, $pipes); +        $data = fread($pipe, 8192); +        var_dump($data); +        if (false === $data || feof($pipe)) { +            fclose($pipe); +            unset($pipes[$type]); +        } +    } +} + + +?> +===DONE=== +--EXPECTF-- +string(2049) "%s" +string(2049) "%s" +string(0) "" +string(0) "" +===DONE=== + diff --git a/ext/standard/tests/streams/proc_open_bug64438.phpt b/ext/standard/tests/streams/proc_open_bug64438.phpt new file mode 100644 index 0000000000..b3857d09d4 --- /dev/null +++ b/ext/standard/tests/streams/proc_open_bug64438.phpt @@ -0,0 +1,70 @@ +--TEST-- +Bug #64438 proc_open hangs with stdin/out with 4097+ bytes +--FILE-- +<?php + +error_reporting(E_ALL); + +if (substr(PHP_OS, 0, 3) == 'WIN') { +	$cmd = PHP_BINARY . ' -n -r "fwrite(STDOUT, $in = file_get_contents(\'php://stdin\')); fwrite(STDERR, $in);"'; +} else { +	$cmd = PHP_BINARY . ' -n -r \'fwrite(STDOUT, $in = file_get_contents("php://stdin")); fwrite(STDERR, $in);\''; +} +$descriptors = array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w')); +$stdin = str_repeat('*', 4097); + +$options = array_merge(array('suppress_errors' => true, 'binary_pipes' => true, 'bypass_shell' => false)); +$process = proc_open($cmd, $descriptors, $pipes, getcwd(), array(), $options); + +foreach ($pipes as $pipe) { +    stream_set_blocking($pipe, false); +} +$writePipes = array($pipes[0]); +$stdinLen = strlen($stdin); +$stdinOffset = 0; + +unset($pipes[0]); + +while ($pipes || $writePipes) { +    $r = $pipes; +    $w = $writePipes; +    $e = null; +    $n = stream_select($r, $w, $e, 60); + +    if (false === $n) { +        break; +    } elseif ($n === 0) { +        proc_terminate($process); + +    } +    if ($w) { +        $written = fwrite($writePipes[0], (binary)substr($stdin, $stdinOffset), 8192); +        if (false !== $written) { +            $stdinOffset += $written; +        } +        if ($stdinOffset >= $stdinLen) { +            fclose($writePipes[0]); +            $writePipes = null; +        } +    } + +    foreach ($r as $pipe) { +        $type = array_search($pipe, $pipes); +        $data = fread($pipe, 8192); +        var_dump($data); +        if (false === $data || feof($pipe)) { +            fclose($pipe); +            unset($pipes[$type]); +        } +    } +} + +?> +===DONE=== +--EXPECTF-- +string(4097) "%s" +string(4097) "%s" +string(0) "" +string(0) "" +===DONE=== + diff --git a/ext/standard/tests/strings/setlocale_variation2.phpt b/ext/standard/tests/strings/setlocale_variation2.phpt index 038ba58c5e..5ebdfe8d50 100644 --- a/ext/standard/tests/strings/setlocale_variation2.phpt +++ b/ext/standard/tests/strings/setlocale_variation2.phpt @@ -18,8 +18,11 @@ if (substr(PHP_OS, 0, 3) == 'WIN') {  /* setlocale() to set all available locales in the system and check the success count */  echo "*** Testing setlocale() : usage variations ***\n"; -function good_locale($locale) { -	return $locale !== 'tt_RU@iqtelif.UTF-8'; +function good_locale($locale) {  +    /** +    * Note: no_NO is a bogus locale and should not be used, see https://bugzilla.redhat.com/971416 +    **/ +	return $locale !== 'tt_RU@iqtelif.UTF-8' && $locale !== 'no_NO.ISO-8859-1';  }  /* Prototype  : array list_system_locales( void ) diff --git a/ext/sysvsem/sysvsem.c b/ext/sysvsem/sysvsem.c index c30def8ba5..fce70b9e02 100644 --- a/ext/sysvsem/sysvsem.c +++ b/ext/sysvsem/sysvsem.c @@ -66,6 +66,7 @@ ZEND_END_ARG_INFO()  ZEND_BEGIN_ARG_INFO_EX(arginfo_sem_acquire, 0, 0, 1)  	ZEND_ARG_INFO(0, sem_identifier) +	ZEND_ARG_INFO(0, nowait)  ZEND_END_ARG_INFO()  ZEND_BEGIN_ARG_INFO_EX(arginfo_sem_release, 0, 0, 1) @@ -298,11 +299,18 @@ PHP_FUNCTION(sem_get)  static void php_sysvsem_semop(INTERNAL_FUNCTION_PARAMETERS, int acquire)  {  	zval *arg_id; +	zend_bool nowait = 0;  	sysvsem_sem *sem_ptr;  	struct sembuf sop; -	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg_id) == FAILURE) { -		return; +	if (acquire) { +		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|b", &arg_id, &nowait) == FAILURE) { +			return; +		} +	} else { +		if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg_id) == FAILURE) { +			return; +		}  	}  	ZEND_FETCH_RESOURCE(sem_ptr, sysvsem_sem *, &arg_id, -1, "SysV semaphore", php_sysvsem_module.le_sem); @@ -314,11 +322,13 @@ static void php_sysvsem_semop(INTERNAL_FUNCTION_PARAMETERS, int acquire)  	sop.sem_num = SYSVSEM_SEM;  	sop.sem_op  = acquire ? -1 : 1; -	sop.sem_flg = SEM_UNDO; +	sop.sem_flg = SEM_UNDO | (nowait ? IPC_NOWAIT : 0);  	while (semop(sem_ptr->semid, &sop, 1) == -1) {  		if (errno != EINTR) { -			php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed to %s key 0x%x: %s", acquire ? "acquire" : "release", sem_ptr->key, strerror(errno)); +			if (errno != EAGAIN) { +				php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed to %s key 0x%x: %s", acquire ? "acquire" : "release", sem_ptr->key, strerror(errno)); +			}  			RETURN_FALSE;  		}  	} diff --git a/ext/sysvsem/tests/nowait.phpt b/ext/sysvsem/tests/nowait.phpt new file mode 100644 index 0000000000..0a6fdf4a50 --- /dev/null +++ b/ext/sysvsem/tests/nowait.phpt @@ -0,0 +1,103 @@ +--TEST-- +sem_acquire with nowait +--SKIPIF-- +<?php // vim600: ts=4 sw=4 syn=php fdm=marker +if(!extension_loaded('sysvsem') || !extension_loaded('pcntl')) { +	die("skip sysvsem and pcntl required"); +} +?> +--FILE-- +<?php +$SEMKEY	= ftok(__FILE__, 'P');  //  Semaphore key + +$pid = pcntl_fork(); + +if ($pid) { +	echo "Parent.\n"; + +	pcntl_signal(SIGCHLD, SIG_IGN); + +	// Get semaphore +	$sem_id = sem_get($SEMKEY, 1); +	if ($sem_id === FALSE) { +		echo "P: fail to get semaphore"; +		exit; +	} +	echo "P: got semaphore $sem_id.\n"; + +	register_shutdown_function(function () use ($sem_id) { +		echo "P: cleanup.\n"; +		sem_remove($sem_id); +	}); +   +	// Acquire semaphore +	if (! sem_acquire($sem_id)) { +		echo "P: fail to acquire semaphore $sem_id.\n"; +		sem_remove($sem_id); +		exit; +	} +	echo "P: success acquire semaphore $sem_id.\n"; + +	usleep(20000); + +	echo "P: releases.\n"; +	sem_release($sem_id); + +	usleep(5000); + +	// Acquire semaphore +	if (! sem_acquire($sem_id)) { +		echo "P: fail to acquire semaphore $sem_id.\n"; +		sem_remove($sem_id); +		exit; +	} +	echo "P: success acquire semaphore $sem_id.\n"; + +	$status = null; +	pcntl_waitpid($pid, $status); + +} else { +	usleep(10000); +	echo "Child.\n"; + +	// Get semaphore +	$sem_id = sem_get($SEMKEY, 1); +	if ($sem_id === FALSE) { +		echo "C: fail to get semaphore"; +		exit; +	} +	echo "C: got semaphore $sem_id.\n"; +   +	// Acquire semaphore +	if (! sem_acquire($sem_id)) { +		echo "C: fail to acquire semaphore $sem_id.\n"; +		exit; +	} +	echo "C: success acquire semaphore $sem_id.\n"; + +	echo "C: releases.\n"; +	sem_release($sem_id); + +	usleep(10000); + +	// Acquire semaphore +	if (! sem_acquire($sem_id, true)) { +		echo "C: fail to acquire semaphore $sem_id.\n"; +		exit; +	} +	echo "C: success acquire semaphore $sem_id.\n"; +} + +?> +--EXPECTF-- +Parent. +P: got semaphore Resource id #%i. +P: success acquire semaphore Resource id #%i. +Child. +C: got semaphore Resource id #%i. +P: releases. +C: success acquire semaphore Resource id #%i. +C: releases. +P: success acquire semaphore Resource id #%i. +C: fail to acquire semaphore Resource id #%i. +P: cleanup. diff --git a/ext/sysvsem/tests/sysv.phpt b/ext/sysvsem/tests/sysv.phpt index 6f52f3bd7e..ccfcf03d32 100644 --- a/ext/sysvsem/tests/sysv.phpt +++ b/ext/sysvsem/tests/sysv.phpt @@ -9,8 +9,8 @@ if(!extension_loaded('sysvsem') || !extension_loaded('sysvshm')) {  --FILE--  <?php  $MEMSIZE = 512;  //  size of shared memory to allocate -$SEMKEY	 =   1;  //  Semaphore key -$SHMKEY	 =   2;  //  Shared memory key +$SEMKEY	 =   ftok(__FILE__, 'P');  //  Semaphore key +$SHMKEY	 =   ftok(__FILE__, 'Q');  //  Shared memory key  echo "Start.\n";  // Get semaphore diff --git a/main/php_variables.c b/main/php_variables.c index 90cfcb20bc..b2df88be61 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -241,7 +241,7 @@ typedef struct post_var_data {  static zend_bool add_post_var(zval *arr, post_var_data_t *var, zend_bool eof TSRMLS_DC)  { -	char *ksep, *vsep; +	char *ksep, *vsep, *val;  	size_t klen, vlen;  	/* FIXME: string-size_t */  	unsigned int new_vlen; @@ -272,15 +272,17 @@ static zend_bool add_post_var(zval *arr, post_var_data_t *var, zend_bool eof TSR  		vlen = 0;  	} -  	php_url_decode(var->ptr, klen); + +	val = estrndup(ksep, vlen);  	if (vlen) { -		vlen = php_url_decode(ksep, vlen); +		vlen = php_url_decode(val, vlen);  	} -	if (sapi_module.input_filter(PARSE_POST, var->ptr, &ksep, vlen, &new_vlen TSRMLS_CC)) { -		php_register_variable_safe(var->ptr, ksep, new_vlen, arr TSRMLS_CC); +	if (sapi_module.input_filter(PARSE_POST, var->ptr, &val, vlen, &new_vlen TSRMLS_CC)) { +		php_register_variable_safe(var->ptr, val, new_vlen, arr TSRMLS_CC);  	} +	efree(val);  	var->ptr = vsep + (vsep != var->end);  	return 1; diff --git a/main/php_version.h b/main/php_version.h index 8e6b2b86ac..1cd646ed02 100644 --- a/main/php_version.h +++ b/main/php_version.h @@ -2,7 +2,7 @@  /* edit configure.in to change version number */  #define PHP_MAJOR_VERSION 5  #define PHP_MINOR_VERSION 6 -#define PHP_RELEASE_VERSION 1 +#define PHP_RELEASE_VERSION 2  #define PHP_EXTRA_VERSION "-dev" -#define PHP_VERSION "5.6.1-dev" -#define PHP_VERSION_ID 50601 +#define PHP_VERSION "5.6.2-dev" +#define PHP_VERSION_ID 50602 diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c index 87312b9ef8..69c6a3ce26 100644 --- a/main/streams/plain_wrapper.c +++ b/main/streams/plain_wrapper.c @@ -342,6 +342,34 @@ static size_t php_stdiop_read(php_stream *stream, char *buf, size_t count TSRMLS  	assert(data != NULL);  	if (data->fd >= 0) { +#ifdef PHP_WIN32 +		php_stdio_stream_data *self = (php_stdio_stream_data*)stream->abstract; + +		if (self->is_pipe || self->is_process_pipe) { +			HANDLE ph = (HANDLE)_get_osfhandle(data->fd); +			int retry = 0; +			DWORD avail_read = 0; + +			do { +				/* Look ahead to get the available data amount to read. Do the same +					as read() does, however not blocking forever. In case it failed, +					no data will be read (better than block). */ +				if (!PeekNamedPipe(ph, NULL, 0, NULL, &avail_read, NULL)) { +					break; +				} +				/* If there's nothing to read, wait in 100ms periods. */ +				if (0 == avail_read) { +					usleep(100000); +				} +			} while (0 == avail_read && retry++ < 320); + +			/* Reduce the required data amount to what is available, otherwise read() +				will block.*/ +			if (avail_read < count) { +				count = avail_read; +			} +		} +#endif  		ret = read(data->fd, buf, count);  		if (ret == (size_t)-1 && errno == EINTR) { diff --git a/php.ini-development b/php.ini-development index 148d194fef..bcc9ac6baf 100644 --- a/php.ini-development +++ b/php.ini-development @@ -1765,7 +1765,7 @@ mssql.secure_connection = Off  ;mbstring.encoding_translation = Off  ; automatic encoding detection order. -; "auto" detect order is changed accoding to mbstring.language +; "auto" detect order is changed according to mbstring.language  ; http://php.net/mbstring.detect-order  ;mbstring.detect_order = auto diff --git a/php.ini-production b/php.ini-production index 5410b3de54..a2a50ea2f8 100644 --- a/php.ini-production +++ b/php.ini-production @@ -1763,7 +1763,7 @@ mssql.secure_connection = Off  ;mbstring.encoding_translation = Off  ; automatic encoding detection order. -; "auto" detect order is changed accoding to mbstring.language +; "auto" detect order is changed according to mbstring.language  ; http://php.net/mbstring.detect-order  ;mbstring.detect_order = auto diff --git a/sapi/cgi/fastcgi.c b/sapi/cgi/fastcgi.c index 8ddc2e4577..6133668306 100644 --- a/sapi/cgi/fastcgi.c +++ b/sapi/cgi/fastcgi.c @@ -1112,7 +1112,7 @@ static inline void fcgi_close(fcgi_request *req, int force, int destroy)  				shutdown(req->fd, 1);  				/* read the last FCGI_STDIN header (it may be omitted) */ -				recv(req->fd, &buf, sizeof(buf), 0); +				recv(req->fd, (char *)(&buf), sizeof(buf), 0);  			}  			closesocket(req->fd);  		} @@ -1122,7 +1122,7 @@ static inline void fcgi_close(fcgi_request *req, int force, int destroy)  			shutdown(req->fd, 1);  			/* read the last FCGI_STDIN header (it may be omitted) */ -			recv(req->fd, &buf, sizeof(buf), 0); +			recv(req->fd, (char *)(&buf), sizeof(buf), 0);  		}  		close(req->fd);  #endif diff --git a/sapi/cli/tests/016.phpt b/sapi/cli/tests/016.phpt index 31c1a40e4a..9c28d15a30 100644 --- a/sapi/cli/tests/016.phpt +++ b/sapi/cli/tests/016.phpt @@ -59,8 +59,6 @@ foreach ($codes as $key => $code) {  echo "\nDone\n";  ?> ---XFAIL-- -https://bugs.php.net/bug.php?id=55496  --EXPECTF--  --------------  Snippet no. 1: diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c index cd5492d73d..5b96dee038 100644 --- a/sapi/fpm/fpm/fpm_main.c +++ b/sapi/fpm/fpm/fpm_main.c @@ -1237,6 +1237,17 @@ static void init_request_info(TSRMLS_D)  										SG(request_info).request_uri = orig_script_name;  									}  									path_info[0] = old; +								} else if (apache_was_here && env_script_name) { +									/* Using mod_proxy_fcgi and ProxyPass, apache cannot set PATH_INFO +									 * As we can extract PATH_INFO from PATH_TRANSLATED +									 * it is probably also in SCRIPT_NAME and need to be removed +									 */ +									int snlen = strlen(env_script_name); +									if (snlen>slen && !strcmp(env_script_name+snlen-slen, path_info)) { +										_sapi_cgibin_putenv("ORIG_SCRIPT_NAME", orig_script_name TSRMLS_CC); +										env_script_name[snlen-slen] = 0; +										SG(request_info).request_uri = _sapi_cgibin_putenv("SCRIPT_NAME", env_script_name TSRMLS_CC); +									}  								}  								env_path_info = _sapi_cgibin_putenv("PATH_INFO", path_info TSRMLS_CC);  							} diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c index e056565ea4..da14d63d8c 100644 --- a/sapi/fpm/fpm/fpm_sockets.c +++ b/sapi/fpm/fpm/fpm_sockets.c @@ -39,29 +39,6 @@ struct listening_socket_s {  static struct fpm_array_s sockets_list; -static int fpm_sockets_resolve_af_inet(char *node, char *service, struct sockaddr_in *addr) /* {{{ */ -{ -	struct addrinfo *res; -	struct addrinfo hints; -	int ret; - -	memset(&hints, 0, sizeof(hints)); -	hints.ai_family = AF_INET; -	ret = getaddrinfo(node, service, &hints, &res); - -	if (ret != 0) { -		zlog(ZLOG_ERROR, "can't resolve hostname '%s%s%s': getaddrinfo said: %s%s%s\n", -					node, service ? ":" : "", service ? service : "", -					gai_strerror(ret), ret == EAI_SYSTEM ? ", system error: " : "", ret == EAI_SYSTEM ? strerror(errno) : ""); -		return -1; -	} - -	*addr = *(struct sockaddr_in *) res->ai_addr; -	freeaddrinfo(res); -	return 0; -} -/* }}} */ -  enum { FPM_GET_USE_SOCKET = 1, FPM_STORE_SOCKET = 2, FPM_STORE_USE_SOCKET = 3 };  static void fpm_sockets_cleanup(int which, void *arg) /* {{{ */ @@ -98,14 +75,23 @@ static void fpm_sockets_cleanup(int which, void *arg) /* {{{ */  }  /* }}} */ +static void *fpm_get_in_addr(struct sockaddr *sa) /* {{{ */ +{ +    if (sa->sa_family == AF_INET) { +        return &(((struct sockaddr_in*)sa)->sin_addr); +    } + +    return &(((struct sockaddr_in6*)sa)->sin6_addr); +} +/* }}} */ +  static int fpm_sockets_hash_op(int sock, struct sockaddr *sa, char *key, int type, int op) /* {{{ */  {  	if (key == NULL) {  		switch (type) {  			case FPM_AF_INET : { -				struct sockaddr_in *sa_in = (struct sockaddr_in *) sa; -				key = alloca(sizeof("xxx.xxx.xxx.xxx:ppppp")); -				sprintf(key, "%u.%u.%u.%u:%u", IPQUAD(&sa_in->sin_addr), (unsigned int) ntohs(sa_in->sin_port)); +				key = alloca(INET6_ADDRSTRLEN); +				inet_ntop(sa->sa_family, fpm_get_in_addr(sa), key, sizeof key);  				break;  			} @@ -254,11 +240,14 @@ enum fpm_address_domain fpm_sockets_domain_from_address(char *address) /* {{{ */  static int fpm_socket_af_inet_listening_socket(struct fpm_worker_pool_s *wp) /* {{{ */  { -	struct sockaddr_in sa_in; +	struct addrinfo hints, *servinfo, *p;  	char *dup_address = strdup(wp->config->listen_address); -	char *port_str = strchr(dup_address, ':'); +	char *port_str = strrchr(dup_address, ':');  	char *addr = NULL; +	int addr_len;  	int port = 0; +	int sock; +	int status;  	if (port_str) { /* this is host:port pair */  		*port_str++ = '\0'; @@ -274,23 +263,35 @@ static int fpm_socket_af_inet_listening_socket(struct fpm_worker_pool_s *wp) /*  		return -1;  	} -	memset(&sa_in, 0, sizeof(sa_in)); - -	if (addr) { -		sa_in.sin_addr.s_addr = inet_addr(addr); -		if (sa_in.sin_addr.s_addr == INADDR_NONE) { /* do resolve */ -			if (0 > fpm_sockets_resolve_af_inet(addr, NULL, &sa_in)) { -				return -1; -			} -			zlog(ZLOG_NOTICE, "address '%s' resolved as %u.%u.%u.%u", addr, IPQUAD(&sa_in.sin_addr)); +	// strip brackets from address for getaddrinfo +	if (addr != NULL) { +		addr_len = strlen(addr); +		if (addr[0] == '[' && addr[addr_len - 1] == ']') { +			addr[addr_len - 1] = '\0'; +			addr++;  		} -	} else { -		sa_in.sin_addr.s_addr = htonl(INADDR_ANY);  	} -	sa_in.sin_family = AF_INET; -	sa_in.sin_port = htons(port); + +	memset(&hints, 0, sizeof hints); +	hints.ai_family = AF_UNSPEC; +	hints.ai_socktype = SOCK_STREAM; + +	if ((status = getaddrinfo(addr, port_str, &hints, &servinfo)) != 0) { +		zlog(ZLOG_ERROR, "getaddrinfo: %s\n", gai_strerror(status)); +		return -1; +	} +  	free(dup_address); -	return fpm_sockets_get_listening_socket(wp, (struct sockaddr *) &sa_in, sizeof(struct sockaddr_in)); + +	for (p = servinfo; p != NULL; p = p->ai_next) { +		if ((sock = fpm_sockets_get_listening_socket(wp, p->ai_addr, p->ai_addrlen)) != -1) { +			break; +		} +	} + +	freeaddrinfo(servinfo); + +	return sock;  }  /* }}} */ diff --git a/sapi/fpm/fpm/fpm_sockets.h b/sapi/fpm/fpm/fpm_sockets.h index 121c016a7b..446c78e410 100644 --- a/sapi/fpm/fpm/fpm_sockets.h +++ b/sapi/fpm/fpm/fpm_sockets.h @@ -45,10 +45,4 @@ static inline int fd_set_blocked(int fd, int blocked) /* {{{ */  }  /* }}} */ -#define IPQUAD(sin_addr) \ -			(unsigned int) ((unsigned char *) &(sin_addr)->s_addr)[0], \ -			(unsigned int) ((unsigned char *) &(sin_addr)->s_addr)[1], \ -			(unsigned int) ((unsigned char *) &(sin_addr)->s_addr)[2], \ -			(unsigned int) ((unsigned char *) &(sin_addr)->s_addr)[3] -  #endif diff --git a/sapi/fpm/php-fpm.conf.in b/sapi/fpm/php-fpm.conf.in index c5f4abc59c..631bc46f42 100644 --- a/sapi/fpm/php-fpm.conf.in +++ b/sapi/fpm/php-fpm.conf.in @@ -152,6 +152,8 @@ group = @php_fpm_group@  ; Valid syntaxes are:  ;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on  ;                            a specific port; +;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +;                            a specific port;  ;   'port'                 - to listen on a TCP socket to all addresses on a  ;                            specific port;  ;   '/path/to/unix/socket' - to listen on a unix socket. diff --git a/sapi/fpm/tests/003.phpt b/sapi/fpm/tests/003.phpt new file mode 100644 index 0000000000..389cb2401e --- /dev/null +++ b/sapi/fpm/tests/003.phpt @@ -0,0 +1,53 @@ +--TEST-- +FPM: Test IPv6 support +--SKIPIF-- +<?php include "skipif.inc"; ?> +--FILE-- +<?php + +include "include.inc"; + +$logfile = dirname(__FILE__).'/php-fpm.log.tmp'; + +$cfg = <<<EOT +[global] +error_log = $logfile +[unconfined] +listen = [::1]:9000 +pm = dynamic +pm.max_children = 5 +pm.start_servers = 2 +pm.min_spare_servers = 1 +pm.max_spare_servers = 3 +EOT; + +$fpm = run_fpm($cfg, $tail); +if (is_resource($fpm)) { +    var_dump(fgets($tail)); +    var_dump(fgets($tail)); +    $i = 0; +    while (($i++ < 30) && !($fp = fsockopen('[::1]', 9000))) { +        usleep(10000); +    } +    if ($fp) { +        echo "Done\n"; +        fclose($fp); +    } +    proc_terminate($fpm); +    stream_get_contents($tail); +    fclose($tail); +    proc_close($fpm); +} + +?> +--EXPECTF-- +string(%d) "[%d-%s-%d %d:%d:%d] NOTICE: fpm is running, pid %d +" +string(%d) "[%d-%s-%d %d:%d:%d] NOTICE: ready to handle connections +" +Done +--CLEAN-- +<?php +    $logfile = dirname(__FILE__).'/php-fpm.log.tmp'; +    @unlink($logfile); +?> diff --git a/sapi/phpdbg/.travis.yml b/sapi/phpdbg/.travis.yml index d5b492e7cf..2e777fbe13 100644 --- a/sapi/phpdbg/.travis.yml +++ b/sapi/phpdbg/.travis.yml @@ -4,7 +4,6 @@ env:  - PHP="PHP-5.4"  - PHP="PHP-5.5"  - PHP="PHP-5.6" -- PHP="master"  before_script: ./travis/ci.sh diff --git a/sapi/phpdbg/README.md b/sapi/phpdbg/README.md index e7e5c731a8..a2a84deb7b 100644 --- a/sapi/phpdbg/README.md +++ b/sapi/phpdbg/README.md @@ -1,7 +1,7 @@  The interactive PHP debugger  ============================ -Implemented as a SAPI module, phpdbg can excert complete control over the environment without impacting the functionality or performance of your code. +Implemented as a SAPI module, phpdbg can exert complete control over the environment without impacting the functionality or performance of your code.  phpdbg aims to be a lightweight, powerful, easy to use debugging platform for PHP 5.4+ diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c index 1fbd18a423..c881559e6e 100644 --- a/sapi/phpdbg/phpdbg.c +++ b/sapi/phpdbg/phpdbg.c @@ -1296,14 +1296,14 @@ phpdbg_main:  		/* do not install sigint handlers for remote consoles */  		/* sending SIGINT then provides a decent way of shutting down the server */ -#if defined(ZEND_SIGNALS) && !defined(_WIN32) -		if (listen[0] < 0) { -			zend_try { zend_signal(SIGINT, phpdbg_sigint_handler TSRMLS_CC); } zend_end_try(); -		} -#elif !defined(_WIN32) +#ifndef _WIN32  		if (listen[0] < 0) {  #endif +#if defined(ZEND_SIGNALS) && !defined(_WIN32) +			zend_try { zend_signal(SIGINT, phpdbg_sigint_handler TSRMLS_CC); } zend_end_try(); +#else  			signal(SIGINT, phpdbg_sigint_handler); +#endif  #ifndef _WIN32  		}  #endif  | 
