Explorar el Código

[Improve][GPL][PHP / lighttpd]

2022.03.08 / Folus Wen

Actions:
1. php-cgi upgrade from 5.6.40 to 7.3.28 for fix safety issue.
2. lighttpd disable sslv2 & sslv3.

Files:
1. As follow commit history

Image version: D0.00.XX.XXXX.XX
Image checksum: XXXXXXXX

Hardware PWB P/N : XXXXXXX
Hardware Version : XXXXXXX
FolusWen hace 3 años
padre
commit
c2d3f4474f
Se han modificado 100 ficheros con 16508 adiciones y 6 borrados
  1. 6 6
      EVSE/GPL/Makefile
  2. BIN
      EVSE/GPL/php-7.3.28.tar.gz
  3. 51 0
      EVSE/GPL/php-7.3.28/.appveyor.yml
  4. 34 0
      EVSE/GPL/php-7.3.28/.editorconfig
  5. 647 0
      EVSE/GPL/php-7.3.28/.gdbinit
  6. 159 0
      EVSE/GPL/php-7.3.28/.gitattributes
  7. 210 0
      EVSE/GPL/php-7.3.28/.gitignore
  8. 74 0
      EVSE/GPL/php-7.3.28/.travis.yml
  9. 322 0
      EVSE/GPL/php-7.3.28/CODING_STANDARDS
  10. 78 0
      EVSE/GPL/php-7.3.28/CONTRIBUTING.md
  11. 3 0
      EVSE/GPL/php-7.3.28/CREDITS
  12. 511 0
      EVSE/GPL/php-7.3.28/EXTENSIONS
  13. 3 0
      EVSE/GPL/php-7.3.28/INSTALL
  14. 68 0
      EVSE/GPL/php-7.3.28/LICENSE
  15. 22 0
      EVSE/GPL/php-7.3.28/Makefile.frag
  16. 78 0
      EVSE/GPL/php-7.3.28/Makefile.gcov
  17. 147 0
      EVSE/GPL/php-7.3.28/Makefile.global
  18. 2621 0
      EVSE/GPL/php-7.3.28/NEWS
  19. 43 0
      EVSE/GPL/php-7.3.28/README.EXT_SKEL
  20. 141 0
      EVSE/GPL/php-7.3.28/README.GIT-RULES
  21. 79 0
      EVSE/GPL/php-7.3.28/README.MAILINGLIST_RULES
  22. 139 0
      EVSE/GPL/php-7.3.28/README.NEW-OUTPUT-API
  23. 235 0
      EVSE/GPL/php-7.3.28/README.PARAMETER_PARSING_API
  24. 545 0
      EVSE/GPL/php-7.3.28/README.REDIST.BINS
  25. 372 0
      EVSE/GPL/php-7.3.28/README.RELEASE_PROCESS
  26. 166 0
      EVSE/GPL/php-7.3.28/README.SELF-CONTAINED-EXTENSIONS
  27. 378 0
      EVSE/GPL/php-7.3.28/README.STREAMS
  28. 194 0
      EVSE/GPL/php-7.3.28/README.SUBMITTING_PATCH
  29. 316 0
      EVSE/GPL/php-7.3.28/README.TESTING
  30. 123 0
      EVSE/GPL/php-7.3.28/README.UNIX-BUILD-SYSTEM
  31. 5 0
      EVSE/GPL/php-7.3.28/README.WIN32-BUILD-SYSTEM
  32. 182 0
      EVSE/GPL/php-7.3.28/README.input_filter
  33. 39 0
      EVSE/GPL/php-7.3.28/README.md
  34. 26 0
      EVSE/GPL/php-7.3.28/TSRM/LICENSE
  35. 6 0
      EVSE/GPL/php-7.3.28/TSRM/Makefile.am
  36. 808 0
      EVSE/GPL/php-7.3.28/TSRM/TSRM.c
  37. 215 0
      EVSE/GPL/php-7.3.28/TSRM/TSRM.h
  38. 3 0
      EVSE/GPL/php-7.3.28/TSRM/acinclude.m4
  39. 33 0
      EVSE/GPL/php-7.3.28/TSRM/buildconf
  40. 4 0
      EVSE/GPL/php-7.3.28/TSRM/config.w32
  41. 35 0
      EVSE/GPL/php-7.3.28/TSRM/configure.ac
  42. 196 0
      EVSE/GPL/php-7.3.28/TSRM/m4/ax_func_which_gethostbyname_r.m4
  43. 3 0
      EVSE/GPL/php-7.3.28/TSRM/readdir.h
  44. 165 0
      EVSE/GPL/php-7.3.28/TSRM/threads.m4
  45. 106 0
      EVSE/GPL/php-7.3.28/TSRM/tsrm.m4
  46. 23 0
      EVSE/GPL/php-7.3.28/TSRM/tsrm_config.w32.h
  47. 80 0
      EVSE/GPL/php-7.3.28/TSRM/tsrm_config_common.h
  48. 72 0
      EVSE/GPL/php-7.3.28/TSRM/tsrm_strtok_r.c
  49. 8 0
      EVSE/GPL/php-7.3.28/TSRM/tsrm_strtok_r.h
  50. 839 0
      EVSE/GPL/php-7.3.28/TSRM/tsrm_win32.c
  51. 120 0
      EVSE/GPL/php-7.3.28/TSRM/tsrm_win32.h
  52. 774 0
      EVSE/GPL/php-7.3.28/UPGRADING
  53. 208 0
      EVSE/GPL/php-7.3.28/UPGRADING.INTERNALS
  54. 56 0
      EVSE/GPL/php-7.3.28/Zend/LICENSE
  55. 55 0
      EVSE/GPL/php-7.3.28/Zend/Makefile.am
  56. 1 0
      EVSE/GPL/php-7.3.28/Zend/Makefile.frag
  57. 43 0
      EVSE/GPL/php-7.3.28/Zend/README.ZEND_MM
  58. 102 0
      EVSE/GPL/php-7.3.28/Zend/README.ZEND_VM
  59. 617 0
      EVSE/GPL/php-7.3.28/Zend/Zend.m4
  60. 228 0
      EVSE/GPL/php-7.3.28/Zend/acinclude.m4
  61. 422 0
      EVSE/GPL/php-7.3.28/Zend/bench.php
  62. 32 0
      EVSE/GPL/php-7.3.28/Zend/buildconf
  63. 133 0
      EVSE/GPL/php-7.3.28/Zend/configure.ac
  64. 17 0
      EVSE/GPL/php-7.3.28/Zend/header
  65. 358 0
      EVSE/GPL/php-7.3.28/Zend/micro_bench.php
  66. 59 0
      EVSE/GPL/php-7.3.28/Zend/tests/001.phpt
  67. 101 0
      EVSE/GPL/php-7.3.28/Zend/tests/002.phpt
  68. 81 0
      EVSE/GPL/php-7.3.28/Zend/tests/003.phpt
  69. 25 0
      EVSE/GPL/php-7.3.28/Zend/tests/004.phpt
  70. 27 0
      EVSE/GPL/php-7.3.28/Zend/tests/005.phpt
  71. 31 0
      EVSE/GPL/php-7.3.28/Zend/tests/006.phpt
  72. 65 0
      EVSE/GPL/php-7.3.28/Zend/tests/007.phpt
  73. 53 0
      EVSE/GPL/php-7.3.28/Zend/tests/008.phpt
  74. 57 0
      EVSE/GPL/php-7.3.28/Zend/tests/009.phpt
  75. 59 0
      EVSE/GPL/php-7.3.28/Zend/tests/010.phpt
  76. 89 0
      EVSE/GPL/php-7.3.28/Zend/tests/011.phpt
  77. 34 0
      EVSE/GPL/php-7.3.28/Zend/tests/012.phpt
  78. 34 0
      EVSE/GPL/php-7.3.28/Zend/tests/013.phpt
  79. 3 0
      EVSE/GPL/php-7.3.28/Zend/tests/014.inc
  80. 52 0
      EVSE/GPL/php-7.3.28/Zend/tests/014.phpt
  81. 37 0
      EVSE/GPL/php-7.3.28/Zend/tests/015.phpt
  82. 12 0
      EVSE/GPL/php-7.3.28/Zend/tests/016.phpt
  83. 82 0
      EVSE/GPL/php-7.3.28/Zend/tests/017.phpt
  84. 34 0
      EVSE/GPL/php-7.3.28/Zend/tests/018.phpt
  85. 1333 0
      EVSE/GPL/php-7.3.28/Zend/tests/019.phpt
  86. 34 0
      EVSE/GPL/php-7.3.28/Zend/tests/020.phpt
  87. 37 0
      EVSE/GPL/php-7.3.28/Zend/tests/021.phpt
  88. 24 0
      EVSE/GPL/php-7.3.28/Zend/tests/022.phpt
  89. 45 0
      EVSE/GPL/php-7.3.28/Zend/tests/023.phpt
  90. 51 0
      EVSE/GPL/php-7.3.28/Zend/tests/024.phpt
  91. 32 0
      EVSE/GPL/php-7.3.28/Zend/tests/025.phpt
  92. 25 0
      EVSE/GPL/php-7.3.28/Zend/tests/026.phpt
  93. 22 0
      EVSE/GPL/php-7.3.28/Zend/tests/027.phpt
  94. 26 0
      EVSE/GPL/php-7.3.28/Zend/tests/028.phpt
  95. 51 0
      EVSE/GPL/php-7.3.28/Zend/tests/029.phpt
  96. 34 0
      EVSE/GPL/php-7.3.28/Zend/tests/030.phpt
  97. 11 0
      EVSE/GPL/php-7.3.28/Zend/tests/031.phpt
  98. 13 0
      EVSE/GPL/php-7.3.28/Zend/tests/032.phpt
  99. 30 0
      EVSE/GPL/php-7.3.28/Zend/tests/033.phpt
  100. 26 0
      EVSE/GPL/php-7.3.28/Zend/tests/034.phpt

+ 6 - 6
EVSE/GPL/Makefile

@@ -128,12 +128,12 @@ libxml2:
 #	cp -f -r libxml2-2.7.6/release/* ../rootfs/
 
 php:
-	echo "php-5.6.40"
-	cd php-5.6.40/;./configure --host=arm-linux-gnueabihf --prefix=$(shell pwd)/php-5.6.40/release --with-libxml-dir=$(shell pwd)/libxml2-2.7.6/release/  -with-config-file-path=/etc --enable-json --enable-libxml --without-zlib --without-pear --enable-simplexml --disable-mbregex --enable-sockets --enable-fpm --disable-opcache --with-pcre-dir --with-sqlite3 --with-curl=$(shell pwd)/curl-7.37.1/release  --disable-all ;cd ../
-	make -C php-5.6.40 CC=$(CROSS_COMPILE)gcc clean
-	make -C php-5.6.40 CC=$(CROSS_COMPILE)gcc 
-	make -C php-5.6.40 CC=$(CROSS_COMPILE)gcc install
-#	cp -f -r php-5.6.40/release/* ../rootfs/
+	echo "php-7.3.28"
+	cd php-7.3.28/;./configure --host=arm-linux-gnueabihf --prefix=$(shell pwd)/php-7.3.28/release --with-libxml-dir=$(shell pwd)/libxml2-2.7.6/release/  -with-config-file-path=/etc --with-valgrind=no --enable-json --enable-libxml --without-zlib --without-pear --enable-simplexml --disable-mbregex --enable-sockets --enable-fpm --disable-opcache --with-pcre-dir --with-sqlite3 --with-curl=$(shell pwd)/curl-7.37.1/release  --disable-all ;cd ../
+	make -C php-7.3.28 CC=$(CROSS_COMPILE)gcc clean
+	make -C php-7.3.28 CC=$(CROSS_COMPILE)gcc 
+	make -C php-7.3.28 CC=$(CROSS_COMPILE)gcc install
+#	cp -f -r php-7.3.28/release/* ../rootfs/
 
 pcre:
 	echo "pcre-8.43"

BIN
EVSE/GPL/php-7.3.28.tar.gz


+ 51 - 0
EVSE/GPL/php-7.3.28/.appveyor.yml

@@ -0,0 +1,51 @@
+version: "{branch}.build.{build}"
+
+image: Visual Studio 2017
+
+branches:
+        except:
+                - PHP-5.6
+                - PHP-7.0
+
+clone_depth: 64
+
+cache:
+        - c:\build-cache
+
+environment:
+        PHP_BUILD_CACHE_BASE_DIR: c:\build-cache
+        PHP_BUILD_OBJ_DIR: c:\obj
+        PHP_BUILD_CACHE_SDK_DIR: c:\build-cache\sdk
+        PHP_BUILD_SDK_BRANCH: php-sdk-2.2.0
+        PHP_BUILD_CRT: vc15
+        # ext and env setup for tests
+        #MYSQL_TEST_PASSWD: Password12!
+        #MYSQL_TEST_USER: root
+        #PDO_MYSQL_TEST_DSN: "pgsql:host=127.0.0.1 port=5432 dbname=test user=root password=Password12!"
+        #PDO_MYSQL_TEST_USER: root
+        #PDO_MYSQL_TEST_PASS: Password12!
+        #PGSQL_TEST_CONNSTR: "host=127.0.0.1 dbname=test port=5432 user=postgres password=Password12!"
+        #PDO_PGSQL_TEST_DSN: "pgsql:host=127.0.0.1 port=5432 dbname=test user=postgres password=Password12!"
+        #build permutations
+        matrix:
+                - THREAD_SAFE: 0
+                  OPCACHE: 0
+                - THREAD_SAFE: 1
+                  OPCACHE: 1
+                  INTRINSICS: AVX
+
+services:
+        # the setup scripts have to be touched, once some other db version is used
+        - mysql
+        - postgresql101
+        - mssql2017
+
+platform:
+        - x64
+          #        - x86
+
+build_script:
+        - appveyor\build.bat
+
+test_script:
+        - appveyor\test.bat

+ 34 - 0
EVSE/GPL/php-7.3.28/.editorconfig

@@ -0,0 +1,34 @@
+# https://editorconfig.org/
+
+root = true
+
+[*]
+trim_trailing_whitespace = true
+insert_final_newline     = true
+end_of_line              = lf
+charset                  = utf-8
+tab_width                = 4
+
+[{*.{awk,bat,c,cpp,d,h,l,mk,re,skl,w32,y},Makefile*}]
+indent_size              = 4
+indent_style             = tab
+
+[*.{dtd,html,inc,php,phpt,rng,wsdl,xml,xsd,xsl}]
+indent_size              = 4
+indent_style             = space
+
+[*.{ac,m4,sh,yml}]
+indent_size              = 2
+indent_style             = space
+
+[*.md]
+indent_style             = space
+max_line_length          = 80
+
+[COMMIT_EDITMSG]
+indent_size              = 4
+indent_style             = space
+max_line_length          = 80
+
+[*.patch]
+trim_trailing_whitespace = false

+ 647 - 0
EVSE/GPL/php-7.3.28/.gdbinit

@@ -0,0 +1,647 @@
+define set_ts
+	set $tsrm_ls = $arg0
+end
+
+document set_ts
+	set the ts resource, it is impossible for gdb to
+	call ts_resource_ex while no process is running,
+	but we could get the resource from the argument
+	of frame info.
+end
+
+define ____executor_globals
+	if basic_functions_module.zts
+		if !$tsrm_ls
+			set $tsrm_ls = ts_resource_ex(0, 0)
+		end
+		set $eg = ((zend_executor_globals*) (*((void ***) $tsrm_ls))[executor_globals_id-1])
+		set $cg = ((zend_compiler_globals*) (*((void ***) $tsrm_ls))[compiler_globals_id-1])
+		set $eg_ptr = $eg
+	else
+		set $eg = executor_globals
+		set $cg = compiler_globals
+		set $eg_ptr = (zend_executor_globals*) &executor_globals
+	end
+end
+
+document ____executor_globals
+	portable way of accessing executor_globals, set $eg
+	this also sets compiler_globals to $cg
+	ZTS detection is automatically based on ext/standard module struct
+end
+
+define print_cvs
+	if $argc == 0
+		____executor_globals
+		set $cv_ex_ptr = $eg.current_execute_data
+	else
+		set $cv_ex_ptr = (zend_execute_data *)$arg0
+	end
+	set $cv_count = $cv_ex_ptr.func.op_array.last_var
+	set $cv = $cv_ex_ptr.func.op_array.vars
+	set $cv_idx = 0
+	set $callFrameSize = (sizeof(zend_execute_data) + sizeof(zval) - 1) / sizeof(zval)
+
+	printf "Compiled variables count: %d\n\n", $cv_count
+	while $cv_idx < $cv_count
+		printf "[%d] '%s'\n", $cv_idx, $cv[$cv_idx].val
+		set $zvalue = ((zval *) $cv_ex_ptr) + $callFrameSize + $cv_idx
+		printzv $zvalue
+		set $cv_idx = $cv_idx + 1
+	end
+end
+
+document print_cvs
+	Prints the compiled variables and their values.
+	If a zend_execute_data pointer is set this will print the compiled
+	variables of that scope. If no parameter is used it will use
+	current_execute_data for scope.
+
+	usage: print_cvs [zend_execute_data *]
+end
+
+define dump_bt
+	set $ex = $arg0
+	while $ex
+		printf "[%p] ", $ex
+		set $func = $ex->func
+		if $func
+			if $ex->This->value.obj
+				if $func->common.scope
+					printf "%s->", $func->common.scope->name->val
+				else
+					printf "%s->", $ex->This->value.obj->ce.name->val
+				end
+			else
+				if $func->common.scope
+					printf "%s::", $func->common.scope->name->val
+				end
+			end
+
+			if $func->common.function_name
+				printf "%s(", $func->common.function_name->val
+			else
+				printf "(main"
+			end
+
+			set $callFrameSize = (sizeof(zend_execute_data) + sizeof(zval) - 1) / sizeof(zval)
+
+			set $count = $ex->This.u2.num_args
+			set $arg = 0
+			while $arg < $count
+				if $arg > 0
+					printf ", "
+				end
+
+				set $zvalue = (zval *) $ex + $callFrameSize + $arg
+				set $type = $zvalue->u1.v.type
+				if $type == 1
+					printf "NULL"
+				end
+				if $type == 2
+					printf "false"
+				end
+				if $type == 3
+					printf "true"
+				end
+				if $type == 4
+					printf "%ld", $zvalue->value.lval
+				end
+				if $type == 5
+					printf "%f", $zvalue->value.dval
+				end
+				if $type == 6
+					____print_str $zvalue->value.str->val $zvalue->value.str->len
+				end
+				if $type == 7
+					printf "array(%d)[%p]", $zvalue->value.arr->nNumOfElements, $zvalue
+				end
+				if $type == 8
+					printf "object[%p]", $zvalue
+				end
+				if $type == 9
+					printf "resource(#%d)", $zvalue->value.lval
+				end
+				if $type == 10
+					printf "reference"
+				end
+				if $type > 10
+					printf "unknown type %d", $type
+				end
+				set $arg = $arg + 1
+			end
+
+			printf ") "
+		else
+			printf "??? "
+		end
+		if $func != 0
+			if $func->type == 2
+				printf "%s:%d ", $func->op_array.filename->val, $ex->opline->lineno
+			else
+				printf "[internal function]"
+			end
+		end
+		set $ex = $ex->prev_execute_data
+		printf "\n"
+	end
+end
+
+document dump_bt
+	dumps the current execution stack. usage: dump_bt executor_globals.current_execute_data
+end
+
+define printzv
+	set $ind = 1
+	____printzv $arg0 0
+end
+
+document printzv
+	prints zval contents
+end
+
+define ____printzv_contents
+	set $zvalue = $arg0
+	set $type = $zvalue->u1.v.type
+
+	# 15 == IS_INDIRECT
+	if $type > 5 && $type != 15
+		printf "(refcount=%d) ", $zvalue->value.counted->gc.refcount
+	end
+
+	if $type == 0
+		printf "UNDEF"
+	end
+	if $type == 1
+		printf "NULL"
+	end
+	if $type == 2
+		printf "bool: false"
+	end
+	if $type == 3
+		printf "bool: true"
+	end
+	if $type == 4
+		printf "long: %ld", $zvalue->value.lval
+	end
+	if $type == 5
+		printf "double: %f", $zvalue->value.dval
+	end
+	if $type == 6
+		printf "string: %s", $zvalue->value.str->val
+	end
+	if $type == 7
+		printf "array: "
+		if ! $arg1
+			set $ind = $ind + 1
+			____print_ht $zvalue->value.arr 1
+			set $ind = $ind - 1
+			set $i = $ind
+			while $i > 0
+				printf "  "
+				set $i = $i - 1
+			end
+		end
+		set $type = 0
+	end
+	if $type == 8
+		printf "object"
+		____executor_globals
+		set $handle = $zvalue->value.obj.handle
+		set $handlers = $zvalue->value.obj.handlers
+		set $zobj = $zvalue->value.obj
+		set $cname = $zobj->ce->name->val
+		printf "(%s) #%d", $cname, $handle
+		if ! $arg1
+			if $handlers->get_properties == &zend_std_get_properties
+				if $zobj->properties
+					set $ht = $zobj->properties
+				else
+					set $ht = &$zobj->ce->properties_info
+				end
+				printf "\nProperties "
+				if $ht
+					set $ind = $ind + 1
+					____print_ht $ht 1
+					set $ind = $ind - 1
+					set $i = $ind
+					while $i > 0
+						printf "  "
+						set $i = $i - 1
+					end
+				else
+					echo "not found"
+				end
+			end
+		end
+		set $type = 0
+	end
+	if $type == 9
+		printf "resource: #%d", $zvalue->value.res->handle
+	end
+	if $type == 10
+		printf "reference: "
+		____printzv &$zvalue->value.ref->val $arg1
+	end
+	if $type == 11
+		printf "const: %s", $zvalue->value.str->val
+	end
+	if $type == 12
+		printf "CONSTANT_AST"
+	end
+	if $type == 13
+		printf "_BOOL"
+	end
+	if $type == 14
+		printf "CALLABLE"
+	end
+	if $type == 15
+		printf "indirect: "
+		____printzv $zvalue->value.zv $arg1
+	end
+	if $type == 17
+		printf "pointer: %p", $zvalue->value.ptr
+	end
+	if $type == 18
+		printf "ITERABLE"
+	end
+	if $type == 19
+		printf "VOID"
+	end
+	if $type == 20
+		printf "_ERROR"
+	end
+	if $type == 16 || $type > 20
+		printf "unknown type %d", $type
+	end
+	printf "\n"
+end
+
+define ____printzv
+	____executor_globals
+	set $zvalue = $arg0
+
+	printf "[%p] ", $zvalue
+
+	set $zcontents = (zval*) $zvalue
+	if $arg1
+		____printzv_contents $zcontents $arg1
+	else
+		____printzv_contents $zcontents 0
+	end
+end
+
+define print_global_vars
+	____executor_globals
+	set $symtable = ((HashTable *)&($eg_ptr->symbol_table))
+	print_ht $symtable
+end
+
+document print_global_vars
+	Prints the global variables
+end
+
+define print_const_table
+	set $ind = 1
+	printf "[%p] {\n", $arg0
+	____print_ht $arg0 4
+	printf "}\n"
+end
+
+document print_const_table
+	Dumps elements of Constants HashTable
+	Example: print_const_table executor_globals.zend_constants
+end
+
+define ____print_ht
+	set $ht = (HashTable*)$arg0
+	set $n = $ind
+	while $n > 0
+		printf "  "
+		set $n = $n - 1
+	end
+
+	if $ht->u.v.flags & 4
+		printf "Packed"
+	else
+		printf "Hash"
+	end
+	printf "(%d)[%p]: {\n", $ht->nNumOfElements, $ht
+
+	set $num = $ht->nNumUsed
+	set $i = 0
+	set $ind = $ind + 1
+	while $i < $num
+		set $p = (Bucket*)($ht->arData + $i)
+		set $n = $ind
+		if $p->val.u1.v.type > 0
+			while $n > 0
+				printf "  "
+				set $n = $n - 1
+			end
+			printf "[%d] ", $i
+			if $p->key
+				printf "%s => ", $p->key->val
+			else
+				printf "%d => ", $p->h
+			end
+			if $arg1 == 0
+				printf "%p\n", (zval *)&$p->val
+			end
+			if $arg1 == 1
+				set $zval = (zval *)&$p->val
+				____printzv $zval 1
+			end
+			if $arg1 == 2
+				printf "%s\n", (char*)$p->val.value.ptr
+			end
+			if $arg1 == 3
+				set $func = (zend_function*)$p->val.value.ptr
+				printf "\"%s\"\n", $func->common.function_name->val
+			end
+			if $arg1 == 4
+				set $const = (zend_constant *)$p->val.value.ptr
+				____printzv $const 1
+			end
+		end
+		set $i = $i + 1
+	end
+	set $ind = $ind - 1
+	printf "}\n"
+end
+
+define print_ht
+	set $ind = 0
+	____print_ht $arg0 1
+end
+
+document print_ht
+	dumps elements of HashTable made of zval
+end
+
+define print_htptr
+	set $ind = 0
+	____print_ht $arg0 0
+end
+
+document print_htptr
+	dumps elements of HashTable made of pointers
+end
+
+define print_htstr
+	set $ind = 0
+	____print_ht $arg0 2
+end
+
+document print_htstr
+	dumps elements of HashTable made of strings
+end
+
+define print_ft
+	set $ind = 0
+	____print_ht $arg0 3
+end
+
+document print_ft
+	dumps a function table (HashTable)
+end
+
+define ____print_inh_class
+	set $ce = $arg0
+	if $ce->ce_flags & 0x10 || $ce->ce_flags & 0x20
+		printf "abstract "
+	else
+		if $ce->ce_flags & 0x40
+			printf "final "
+		end
+	end
+	printf "class %s", $ce->name->val
+	if $ce->parent != 0
+		printf " extends %s", $ce->parent->name->val
+	end
+	if $ce->num_interfaces != 0
+		printf " implements"
+		set $tmp = 0
+		while $tmp < $ce->num_interfaces
+			printf " %s", $ce->interfaces[$tmp]->name->val
+			set $tmp = $tmp + 1
+			if $tmp < $ce->num_interfaces
+				printf ","
+			end
+		end
+	end
+	set $ce = $ce->parent
+end
+
+define ____print_inh_iface
+	set $ce = $arg0
+	printf "interface %s", $ce->name->val
+	if $ce->num_interfaces != 0
+		set $ce = $ce->interfaces[0]
+		printf " extends %s", $ce->name->val
+	else
+		set $ce = 0
+	end
+end
+
+define print_inh
+	set $ce = $arg0
+	set $depth = 0
+	while $ce != 0
+		set $tmp = $depth
+		while $tmp != 0
+			printf " "
+			set $tmp = $tmp - 1
+		end
+		set $depth = $depth + 1
+		if $ce->ce_flags & 0x80
+			____print_inh_iface $ce
+		else
+			____print_inh_class $ce
+		end
+		printf " {\n"
+	end
+	while $depth != 0
+		set $tmp = $depth
+		while $tmp != 1
+			printf " "
+			set $tmp = $tmp - 1
+		end
+		printf "}\n"
+		set $depth = $depth - 1
+	end
+end
+
+define print_pi
+	set $pi = (zend_property_info *)$arg0
+	set $initial_offset = ((uint32_t)(zend_uintptr_t)(&((zend_object*)0)->properties_table[(0)]))
+	set $ptr_to_val = (zval*)((char*)$pi->ce->default_properties_table + $pi->offset - $initial_offset)
+	printf "[%p] {\n", $pi
+	printf "    offset = %p\n", $pi->offset
+	printf "    ce = [%p] %s\n", $pi->ce, $pi->ce->name->val
+	printf "    flags = 0x%x (", $pi->flags
+	if $pi->flags & 0x100
+		printf "ZEND_ACC_PUBLIC"
+	else
+		if $pi->flags & 0x200
+			printf "ZEND_ACC_PROTECTED"
+		else
+			if $pi->flags & 0x400
+				printf "ZEND_ACC_PRIVATE"
+			else
+				if $pi->flags & 0x800
+					printf "ZEND_ACC_EARLY_BINDING"
+				else
+					if $pi->flags & 0x20000
+						printf "ZEND_ACC_SHADOW"
+					end
+				end
+			end
+		end
+	end
+	printf ")\n"
+	printf "    name  = "
+	print_zstr $pi->name
+	printf "    default value: "
+	printzv $ptr_to_val
+	printf "}\n"
+end
+
+document print_pi
+	Takes a pointer to an object's property and prints the property information
+	usage: print_pi <ptr>
+end
+
+define ____print_str
+	set $tmp = 0
+	set $str = $arg0
+	if $argc > 2
+		set $maxlen = $arg2
+	else
+		set $maxlen = 256
+	end
+
+	printf "\""
+	while $tmp < $arg1 && $tmp < $maxlen
+		if $str[$tmp] > 31 && $str[$tmp] < 127
+			printf "%c", $str[$tmp]
+		else
+			printf "\\%o", $str[$tmp]
+		end
+		set $tmp = $tmp + 1
+	end
+	if $tmp != $arg1
+		printf "..."
+	end
+	printf "\""
+end
+
+define printzn
+	____executor_globals
+	set $ind = 0
+	set $znode = $arg0
+	if $znode->op_type == 1
+		set $optype = "IS_CONST"
+	end
+	if $znode->op_type == 2
+		set $optype = "IS_TMP_VAR"
+	end
+	if $znode->op_type == 4
+		set $optype = "IS_VAR"
+	end
+	if $znode->op_type == 8
+		set $optype = "IS_UNUSED"
+	end
+
+	printf "[%p] %s", $znode, $optype
+
+	if $znode->op_type == 1
+		printf ": "
+		____printzv &$znode->u.constant 0
+	end
+	if $znode->op_type == 2
+		printf ": "
+		set $tvar = (union _temp_variable *)((char *)$eg.current_execute_data->Ts + $znode->u.var)
+		____printzv ((union _temp_variable *)$tvar)->tmp_var 0
+	end
+	if $znode->op_type == 4
+		printf ": "
+		set $tvar = (union _temp_variable *)((char *)$eg.current_execute_data->Ts + $znode->u.var)
+		____printzv *$tvar->var.ptr_ptr 0
+	end
+	if $znode->op_type == 8
+		printf "\n"
+	end
+end
+
+document printzn
+	print type and content of znode.
+	usage: printzn &opline->op1
+end
+
+define printzops
+	printf "op1 => "
+	printzn &execute_data->opline.op1
+	printf "op2 => "
+	printzn &execute_data->opline.op2
+	printf "result => "
+	printzn &execute_data->opline.result
+end
+
+document printzops
+	dump operands of the current opline
+end
+
+define print_zstr
+	set $zstr = (zend_string *)$arg0
+	if $argc == 2
+		set $maxlen = $arg1
+	else
+		set $maxlen = $zstr->len
+	end
+	printf "string(%d) ", $zstr->len
+	____print_str $zstr->val $zstr->len $maxlen
+	printf "\n"
+end
+
+document print_zstr
+	print the length and contents of a zend string
+	usage: print_zstr <ptr> [max length]
+end
+
+define zbacktrace
+	____executor_globals
+	dump_bt $eg.current_execute_data
+end
+
+document zbacktrace
+	prints backtrace.
+	This command is almost a short cut for
+	> (gdb) ____executor_globals
+	> (gdb) dump_bt $eg.current_execute_data
+end
+
+define lookup_root
+	set $found = 0
+	if gc_globals->roots
+		set $current = gc_globals->roots->next
+		printf "looking ref %p in roots\n", $arg0
+		while $current != &gc_globals->roots
+			if $current->ref == $arg0
+				set $found = $current
+				break
+			end
+			set $current = $current->next
+		end
+		if $found != 0
+			printf "found root %p\n", $found
+		else
+			printf "not found\n"
+		end
+	end
+end
+
+document lookup_root
+	lookup a refcounted in root
+	usage: lookup_root [ptr].
+end

+ 159 - 0
EVSE/GPL/php-7.3.28/.gitattributes

@@ -0,0 +1,159 @@
+ext/mysqlnd/mysqlnd.h           ident
+ext/ext_skel.php                ident
+ext/phar/phar/pharcommand.inc   ident
+ext/dba/libinifile/inifile.c    ident
+ext/dba/libflatfile/flatfile.c  ident
+ext/dba/libcdb/cdb_make.c       ident
+ext/dba/libcdb/cdb.c            ident
+run-tests.php                   ident
+NEWS                            merge=NEWS
+UPGRADING                       merge=NEWS
+UPGRADING.INTERNALS             merge=NEWS
+/ext/bz2/tests/with_strings.phpt	-crlf
+/ext/dom/tests/bug40836.phpt	-crlf
+/ext/dom/tests/domelement.phpt	-crlf
+/ext/iconv/tests/iconv004.phpt	-crlf
+/ext/iconv/tests/iconv_basic.phpt	-crlf
+/ext/iconv/tests/iconv_strpos.phpt	-crlf
+/ext/iconv/tests/iconv_strpos_variation2.phpt	-crlf
+/ext/mbstring/tests/mb_strtoupper_error2.phpt	-crlf
+/ext/phar/tests/delete_in_phar_confirm.phpt	-crlf
+/ext/phar/tests/frontcontroller12.phpt	-crlf
+/ext/phar/tests/security.phpt	-crlf
+/ext/phar/tests/test_signaturealgos.phpt	-crlf
+/ext/reflection/tests/ReflectionMethod_invokeArgs_basic.phpt	-crlf
+/ext/reflection/tests/ReflectionProperty_getModifiers_basic.phpt	-crlf
+/ext/spl/tests/dllist_007.phpt	-crlf
+/ext/spl/tests/iterator_012.phpt	-crlf
+/ext/spl/tests/SplArray_fromArray.phpt	-crlf
+/ext/standard/tests/dir/scandir_variation3.phpt	-crlf
+/ext/standard/tests/general_functions/escapeshellcmd-win32.phpt	-crlf
+/ext/standard/tests/strings/bug26817.phpt	-crlf
+/ext/standard/tests/strings/bug26973.phpt	-crlf
+/ext/standard/tests/strings/bug27457.phpt	-crlf
+/ext/standard/tests/strings/bug28386.phpt	-crlf
+/ext/standard/tests/strings/bug37262.phpt	-crlf
+/ext/standard/tests/strings/bug40637.phpt	-crlf
+/ext/standard/tests/strings/bug40915.phpt	-crlf
+/ext/standard/tests/strings/bug61374.phpt	-crlf
+/ext/standard/tests/strings/chop_error.phpt	-crlf
+/ext/standard/tests/strings/chop_variation2.phpt	-crlf
+/ext/standard/tests/strings/chunk_split_variation10.phpt	-crlf
+/ext/standard/tests/strings/chunk_split_variation8.phpt	-crlf
+/ext/standard/tests/strings/count_chars_variation2.phpt	-crlf
+/ext/standard/tests/strings/dirname_error.phpt	-crlf
+/ext/standard/tests/strings/fprintf_variation_007_64bit.phpt	-crlf
+/ext/standard/tests/strings/highlight_file.phpt	-crlf
+/ext/standard/tests/strings/htmlentities03.phpt	-crlf
+/ext/standard/tests/strings/htmlentities04.phpt	-crlf
+/ext/standard/tests/strings/htmlentities08.phpt	-crlf
+/ext/standard/tests/strings/htmlentities15.phpt	-crlf
+/ext/standard/tests/strings/http_build_query.phpt	-crlf
+/ext/standard/tests/strings/metaphone.phpt	-crlf
+/ext/standard/tests/strings/ord_error.phpt	-crlf
+/ext/standard/tests/strings/printf_basic2.phpt	-crlf
+/ext/standard/tests/strings/printf_variation2.phpt	-crlf
+/ext/standard/tests/strings/quoted_printable_decode_basic.phpt	-crlf
+/ext/standard/tests/strings/rtrim.phpt	-crlf
+/ext/standard/tests/strings/setlocale_variation1.phpt	-crlf
+/ext/standard/tests/strings/sha1_basic.phpt	-crlf
+/ext/standard/tests/strings/similar_text_basic.phpt	-crlf
+/ext/standard/tests/strings/soundex.phpt	-crlf
+/ext/standard/tests/strings/sprintf_basic1.phpt	-crlf
+/ext/standard/tests/strings/sprintf_basic4.phpt	-crlf
+/ext/standard/tests/strings/sprintf_basic7.phpt	-crlf
+/ext/standard/tests/strings/sprintf_variation12.phpt	-crlf
+/ext/standard/tests/strings/sprintf_variation28.phpt	-crlf
+/ext/standard/tests/strings/sprintf_variation29.phpt	-crlf
+/ext/standard/tests/strings/sprintf_variation30.phpt	-crlf
+/ext/standard/tests/strings/sprintf_variation31.phpt	-crlf
+/ext/standard/tests/strings/sprintf_variation38.phpt	-crlf
+/ext/standard/tests/strings/sprintf_variation42.phpt	-crlf
+/ext/standard/tests/strings/sprintf_variation6.phpt	-crlf
+/ext/standard/tests/strings/sscanf_basic2.phpt	-crlf
+/ext/standard/tests/strings/sscanf_basic3.phpt	-crlf
+/ext/standard/tests/strings/str_getcsv_001.phpt	-crlf
+/ext/standard/tests/strings/stripcslashes_basic.phpt	-crlf
+/ext/standard/tests/strings/stripos_variation11.phpt	-crlf
+/ext/standard/tests/strings/stripos_variation13.phpt	-crlf
+/ext/standard/tests/strings/stripslashes_variation1.phpt	-crlf
+/ext/standard/tests/strings/stripslashes_variation2.phpt	-crlf
+/ext/standard/tests/strings/stristr_error.phpt	-crlf
+/ext/standard/tests/strings/strnatcasecmp_basic.phpt	-crlf
+/ext/standard/tests/strings/strncasecmp_variation6.phpt	-crlf
+/ext/standard/tests/strings/strncasecmp_variation7.phpt	-crlf
+/ext/standard/tests/strings/strncasecmp_variation8.phpt	-crlf
+/ext/standard/tests/strings/strrchr_error.phpt	-crlf
+/ext/standard/tests/strings/strrchr.phpt	-crlf
+/ext/standard/tests/strings/strrchr_variation11.phpt	-crlf
+/ext/standard/tests/strings/strrpos_error.phpt	-crlf
+/ext/standard/tests/strings/strrpos_variation4.phpt	-crlf
+/ext/standard/tests/strings/strrpos_variation8.phpt	-crlf
+/ext/standard/tests/strings/strstr2.phpt	-crlf
+/ext/standard/tests/strings/strtok_error.phpt	-crlf
+/ext/standard/tests/strings/strtok_variation2.phpt	-crlf
+/ext/standard/tests/strings/strtolower-win32.phpt	-crlf
+/ext/standard/tests/strings/substr_compare.phpt	-crlf
+/ext/standard/tests/strings/ucwords_variation1.phpt	-crlf
+/ext/standard/tests/strings/unpack.phpt	-crlf
+/ext/standard/tests/strings/vfprintf_basic7_64bit.phpt	-crlf
+/ext/standard/tests/strings/vfprintf_variation11_64bit.phpt	-crlf
+/ext/standard/tests/strings/vfprintf_variation12_64bit.phpt	-crlf
+/ext/standard/tests/strings/vfprintf_variation12.phpt	-crlf
+/ext/standard/tests/strings/vfprintf_variation13_64bit.phpt	-crlf
+/ext/standard/tests/strings/vfprintf_variation7.phpt	-crlf
+/ext/standard/tests/strings/vprintf_basic2.phpt	-crlf
+/ext/standard/tests/strings/vprintf_basic7_64bit.phpt	-crlf
+/ext/standard/tests/strings/vprintf_variation10.phpt	-crlf
+/ext/standard/tests/strings/vprintf_variation14_64bit.phpt	-crlf
+/ext/standard/tests/strings/vprintf_variation17.phpt	-crlf
+/ext/standard/tests/strings/vprintf_variation4.phpt	-crlf
+/ext/standard/tests/strings/vsprintf_basic4.phpt	-crlf
+/ext/standard/tests/strings/vsprintf_basic8.phpt	-crlf
+/ext/standard/tests/strings/vsprintf_variation12_64bit.phpt	-crlf
+/ext/standard/tests/strings/vsprintf_variation13_64bit.phpt	-crlf
+/ext/standard/tests/strings/vsprintf_variation15_64bit.phpt	-crlf
+/ext/standard/tests/strings/vsprintf_variation17.phpt	-crlf
+/ext/standard/tests/strings/vsprintf_variation4_64bit.phpt	-crlf
+/ext/standard/tests/strings/vsprintf_variation7.phpt	-crlf
+/ext/standard/tests/strings/wordwrap.phpt	-crlf
+/ext/standard/tests/strings/wordwrap_variation5.phpt	-crlf
+/ext/standard/tests/url/rawurldecode_variation_001.phpt	-crlf
+/ext/tidy/tests/009.phpt	-crlf
+/ext/tidy/tests/013.phpt	-crlf
+/ext/tidy/tests/021.phpt	-crlf
+/ext/tidy/tests/tidy_error.phpt	-crlf
+/ext/tokenizer/tests/002.phpt	-crlf
+/ext/tokenizer/tests/bug26463.phpt	-crlf
+/ext/tokenizer/tests/token_get_all_error.phpt	-crlf
+/ext/tokenizer/tests/token_get_all_variation11.phpt	-crlf
+/ext/tokenizer/tests/token_get_all_variation12.phpt	-crlf
+/ext/tokenizer/tests/token_get_all_variation13.phpt	-crlf
+/ext/tokenizer/tests/token_get_all_variation14.phpt	-crlf
+/ext/tokenizer/tests/token_get_all_variation15.phpt	-crlf
+/ext/tokenizer/tests/token_get_all_variation18.phpt	-crlf
+/ext/tokenizer/tests/token_get_all_variation19.phpt	-crlf
+/ext/tokenizer/tests/token_get_all_variation1.phpt	-crlf
+/ext/tokenizer/tests/token_get_all_variation2.phpt	-crlf
+/ext/tokenizer/tests/token_get_all_variation3.phpt	-crlf
+/ext/tokenizer/tests/token_get_all_variation5.phpt	-crlf
+/ext/tokenizer/tests/token_get_all_variation8.phpt	-crlf
+/ext/xml/tests/bug32001b.phpt		-crlf
+/ext/xmlwriter/tests/OO_003.phpt	-crlf
+/ext/xmlwriter/tests/xmlwriter_write_attribute_ns_error_001.phpt	-crlf
+/ext/zlib/tests/008.phpt			-crlf
+/ext/zlib/tests/gzopen_variation4.phpt	-crlf
+/ext/zlib/tests/gzrewind_error.phpt	-crlf
+/ext/zlib/tests/readgzfile_variation7.phpt	-crlf
+/ext/zlib/tests/readgzfile_variation8.phpt	-crlf
+/ext/zlib/tests/zlib_scheme_stat_basic.phpt	-crlf
+/sapi/cli/tests/006.phpt			-crlf
+/tests/run-test/test009.phpt		-crlf
+/Zend/tests/012.phpt				-crlf
+/Zend/tests/bug28072.phpt			-crlf
+/Zend/tests/bug38624.phpt			-crlf
+/Zend/tests/bug40784.phpt			-crlf
+/Zend/tests/bug43053.phpt			-crlf
+/Zend/tests/bug51176.phpt			-crlf
+/Zend/tests/each_003.phpt			-crlf
+/Zend/tests/errmsg_006.phpt			-crlf

+ 210 - 0
EVSE/GPL/php-7.3.28/.gitignore

@@ -0,0 +1,210 @@
+# General ignores
+*~
+.#*
+*.
+*.slo
+*.mk
+*.mem
+*.gcda
+*.gcno
+*.la
+*.lo
+*.loT
+*.o
+*.a
+*.ncb
+*.opt
+*.plg
+*swp
+*.patch
+*.tgz
+*.tar.gz
+*.tar.bz2
+*.tar.xz
+*.tar.gz.asc
+*.tar.bz2.asc
+*.tar.xz.asc
+.FBCIndex
+.FBCLockFolder
+.libs
+phpt.*
+core
+dynlib.m4
+Makefile
+Makefile.fragments
+Makefile.objects
+_libs
+acconfig.h
+aclocal.m4
+autom4te.cache
+bsd_converted
+buildconf.stamp
+buildmk.stamp
+confdefs.h
+config.h
+config.guess
+config.cache
+config.h.in
+config.log
+config.nice
+config.status
+config.sub
+config_vars.mk
+configuration-parser.c
+configuration-parser.h
+configuration-parser.output
+configuration-scanner.c
+configure
+conftest
+conftest.c
+debug.log
+diff
+generated_lists
+include
+install-sh
+internal_functions.c
+lcov_data
+lcov_html
+libs
+libtool
+meta_cc
+meta_ccld
+missing
+mkinstalldirs
+modules
+php
+php7.spec
+php_lcov.info
+php_test_results_*.txt
+php_version.h
+results.txt
+shlibtool
+stamp-h
+test.php3
+tmp-php.ini
+stamp-h.in
+scan_makefile_in.awk
+main/php_config.h
+main/php_config.h.in
+main/build-defs.h
+main/internal_functions_cli.c
+main/config.w32.h
+main/stamp-h1
+main/streams/build-defs.h
+main/streams/stamp-h1
+pear/install-pear-nozlib.phar
+pear/phpize
+pear/run-tests
+pear/php-config
+pear/scripts
+sapi/apache2handler/libphp7.module
+sapi/cgi/php-cgi
+sapi/cgi/php-cgi.1
+sapi/cli/php.1
+sapi/fpm/php-fpm
+sapi/fpm/php-fpm.1
+sapi/fpm/init.d.php-fpm
+sapi/fpm/php-fpm.conf
+sapi/fpm/fpm/php-cgi
+sapi/fpm/php-fpm.8
+sapi/fpm/php-fpm.service
+sapi/fpm/status.html
+sapi/fpm/www.conf
+sapi/phpdbg/phpdbg_parser.c
+sapi/phpdbg/phpdbg_parser.h
+sapi/phpdbg/phpdbg
+sapi/phpdbg/phpdbg.1
+sapi/phpdbg/build
+sapi/phpdbg/*.output
+scripts/php-config
+scripts/phpize
+scripts/man1/*.1
+TSRM/tsrm_config.h
+win32/*.suo
+win32/*.aps
+win32/*.positions
+win32/ext
+win32/phpts.def
+win32/wsyslog.h
+Zend/zend_config.h
+Zend/zend_dtrace_gen.h
+Zend/zend_dtrace_gen.hbak
+Zend/zend_ini_parser.c
+Zend/zend_ini_parser.h
+Zend/zend_ini_parser.output
+Zend/zend_language_parser.c
+Zend/zend_language_parser.h
+Zend/zend_language_parser.output
+
+# Extension specific ignores
+ext/*/configure.ac
+ext/*/ltmain.sh
+ext/*/libs.mk
+ext/*/build
+ext/*/scan_makefile_in.awk
+ext/*/Makefile.global
+ext/*/acinclude.m4
+ext/*/config.sub
+ext/date/lib/timelib_config.h
+ext/iconv/php_have_bsd_iconv.h
+ext/iconv/php_have_ibm_iconv.h
+ext/iconv/php_have_libiconv.h
+ext/iconv/php_php_iconv_h_path.h
+ext/iconv/php_have_glibc_iconv.h
+ext/iconv/php_php_iconv_impl.h
+ext/iconv/php_have_iconv.h
+ext/iconv/php_iconv_supports_errno.h
+ext/iconv/php_iconv_broken_ignore.h
+ext/iconv/php_iconv_aliased_libiconv.h
+ext/mbstring/oniguruma/oniguruma.h
+ext/oci8/tests/*.vglog
+ext/pdo/conftest*
+ext/pdo_firebird/conftest*
+ext/pdo_mysql/conftest*
+ext/pdo_oci/conftest*
+ext/pdo_odbc/tests/*.mdb
+ext/pdo_pgsql/conftest*
+ext/pdo_sqlite/conftest*
+ext/pdo_sqlite/sqlite3.h
+ext/phar/phar.phar
+ext/phar/phar.1
+ext/phar/phar.phar.1
+ext/phar/phar.php
+ext/reflection/xml
+ext/reflection/html
+ext/reflection/spl.chm
+ext/spl/examples/.htaccess
+ext/spl/examples/*.phps
+ext/sqlite3/tests/phpsql*
+
+# ------------------------------------------------------------------------------ Windows
+# Generated by `/buildconf.bat`
+/configure.bat
+/configure.js
+
+# Generated by `/configure.(bat|js)` (architecture dependend)
+/config.nice.bat
+/Debug/
+/Debug_TS/
+/Release/
+/Release_TS/
+/x64/
+
+# ------------------------------------------------------------------------------ Tests
+# Generated by `/run-tests.php` upon failure
+**/tests/**/*.diff
+**/tests/**/*.out*
+**/tests/**/*.php
+**/tests/**/*.exp
+**/tests/**/*.log
+**/tests/**/*.sh
+
+# Used by some test cases.
+**/tests/**/*.db
+**/tests/**/*.txt
+**/tests/**/*.tmp
+
+# Special cases to invert previous ignore rules
+!ext/fileinfo/libmagic.patch
+!ext/mbstring/oniguruma.patch
+!ext/pcre/pcre2lib/config.h

+ 74 - 0
EVSE/GPL/php-7.3.28/.travis.yml

@@ -0,0 +1,74 @@
+git:
+  quiet: true
+
+dist: trusty
+language: c
+sudo: required
+addons:
+  apt:
+    packages:
+      - locales
+      - language-pack-de
+      - re2c
+      - libgmp-dev
+      - libicu-dev
+      - libtidy-dev
+      - libenchant-dev
+      - libaspell-dev
+      - libpspell-dev
+      - librecode-dev
+      - libsasl2-dev
+      - libxpm-dev
+      - libt1-dev
+      - libzip-dev
+
+notifications:
+    email:
+       on_failure: change
+    irc:
+      template:
+        - "%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message} -  Change view : %{compare_url} - Build details : %{build_url}"
+      channels:
+        - "irc.efnet.org#php.pecl"
+      on_success: change
+      on_failure: always
+
+cache:
+    apt: true
+    ccache: true
+
+env:
+    global:
+      - MYSQL_TEST_HOST=127.0.0.1
+      - MYSQL_TEST_USER=travis
+      - PDO_MYSQL_TEST_DSN="mysql:host=127.0.0.1;dbname=test"
+      - PDO_MYSQL_TEST_USER=travis
+      - PDO_MYSQL_TEST_PASS=
+      - PDO_MYSQL_TEST_HOST=127.0.0.1
+      - REPORT_EXIT_STATUS=1
+    matrix:
+      - ENABLE_MAINTAINER_ZTS=0 ENABLE_DEBUG=0
+      - ENABLE_MAINTAINER_ZTS=1 ENABLE_DEBUG=1
+
+before_script:
+    - ccache --version
+    - ccache --zero-stats
+    - export USE_CCACHE=1
+    # Enable IPv6
+    - sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6'
+    # Compile PHP
+    - ./travis/compile.sh
+    # Setup Extensions
+    - . ./travis/ext/mysql/setup.sh
+    - . ./travis/ext/mysqli/setup.sh
+    - . ./travis/ext/pdo_mysql/setup.sh
+    - . ./travis/ext/pgsql/setup.sh
+    - . ./travis/ext/pdo_pgsql/setup.sh
+
+# Run PHPs run-tests.php
+script:
+    - ./sapi/cli/php run-tests.php -P -d extension=`pwd`/modules/zend_test.so $(if [ $ENABLE_DEBUG == 0 ]; then echo "-d opcache.enable_cli=1 -d zend_extension=`pwd`/modules/opcache.so"; fi) -g "FAIL,XFAIL,BORK,WARN,LEAK,SKIP" --offline --show-diff --show-slow 1000 --set-timeout 120
+    - sapi/cli/php -d extension_dir=`pwd`/modules -r 'dl("zend_test");'
+
+after_success:
+    - ccache --show-stats

+ 322 - 0
EVSE/GPL/php-7.3.28/CODING_STANDARDS

@@ -0,0 +1,322 @@
+========================
+  PHP Coding Standards
+========================
+
+This file lists several standards that any programmer adding or changing
+code in PHP should follow.  Since this file was added at a very late
+stage of the development of PHP v3.0, the code base does not fully
+follow it, but new features are going in that general direction.  Many
+sections have been recoded to use these rules.
+
+Code Implementation
+-------------------
+
+0.  Document your code in source files and the manual. [tm]
+
+1.  Functions that are given pointers to resources should not free them
+
+For instance, ``function int mail(char *to, char *from)`` should NOT free
+to and/or from.
+
+Exceptions:
+
+- The function's designated behavior is freeing that resource.  E.g. efree()
+
+- The function is given a boolean argument, that controls whether or not
+  the function may free its arguments (if true - the function must free its
+  arguments, if false - it must not)
+
+- Low-level parser routines, that are tightly integrated with the token
+  cache and the bison code for minimum memory copying overhead.
+
+2.  Functions that are tightly integrated with other functions within the
+    same module, and rely on each other non-trivial behavior, should be
+    documented as such and declared 'static'.  They should be avoided if
+    possible.
+
+3.  Use definitions and macros whenever possible, so that constants have
+    meaningful names and can be easily manipulated.  The only exceptions
+    to this rule are 0 and 1, when used as false and true (respectively).
+    Any other use of a numeric constant to specify different behavior
+    or actions should be done through a #define.
+
+4.  When writing functions that deal with strings, be sure to remember
+    that PHP holds the length property of each string, and that it
+    shouldn't be calculated with strlen().  Write your functions in such
+    a way so that they'll take advantage of the length property, both
+    for efficiency and in order for them to be binary-safe.
+    Functions that change strings and obtain their new lengths while
+    doing so, should return that new length, so it doesn't have to be
+    recalculated with strlen() (e.g. php_addslashes())
+
+5.  NEVER USE strncat().  If you're absolutely sure you know what you're doing,
+    check its man page again, and only then, consider using it, and even then,
+    try avoiding it.
+
+6.  Use ``PHP_*`` macros in the PHP source, and ``ZEND_*`` macros in the Zend
+    part of the source. Although the ``PHP_*`` macro's are mostly aliased to the
+    ``ZEND_*`` macros it gives a better understanding on what kind of macro
+    you're calling.
+
+7.  When commenting out code using a #if statement, do NOT use 0 only. Instead
+    use "<git username here>_0". For example, #if FOO_0, where FOO is your
+    git user foo.  This allows easier tracking of why code was commented out,
+    especially in bundled libraries.
+
+8.  Do not define functions that are not available.  For instance, if a
+    library is missing a function, do not define the PHP version of the
+    function, and do not raise a run-time error about the function not
+    existing.  End users should use function_exists() to test for the
+    existence of a function
+
+9.  Prefer emalloc(), efree(), estrdup(), etc. to their standard C library
+    counterparts.  These functions implement an internal "safety-net"
+    mechanism that ensures the deallocation of any unfreed memory at the
+    end of a request.  They also provide useful allocation and overflow
+    information while running in debug mode.
+
+    In almost all cases, memory returned to the engine must be allocated
+    using emalloc().
+
+    The use of malloc() should be limited to cases where a third-party
+    library may need to control or free the memory, or when the memory in
+    question needs to survive between multiple requests.
+
+User Functions/Methods Naming Conventions
+------------------
+
+1.  Function names for user-level functions should be enclosed with in
+    the PHP_FUNCTION() macro. They should be in lowercase, with words
+    underscore delimited, with care taken to minimize the letter count.
+    Abbreviations should not be used when they greatly decrease the
+    readability of the function name itself::
+
+    Good:
+    'str_word_count'
+    'array_key_exists'
+
+    Ok:
+    'date_interval_create_from_date_string'
+    (could be 'date_intvl_create_from_date_str'?)
+    'get_html_translation_table'
+    (could be 'html_get_trans_table'?)
+
+    Bad:
+    'hw_GetObjectByQueryCollObj'
+    'pg_setclientencoding'
+    'jf_n_s_i'
+
+2.  If they are part of a "parent set" of functions, that parent should
+    be included in the user function name, and should be clearly related
+    to the parent program or function family. This should be in the form
+    of ``parent_*``::
+
+    A family of 'foo' functions, for example:
+
+    Good:
+    'foo_select_bar'
+    'foo_insert_baz'
+    'foo_delete_baz'
+
+    Bad:
+    'fooselect_bar'
+    'fooinsertbaz'
+    'delete_foo_baz'
+
+3.  Function names used by user functions should be prefixed
+    with ``_php_``, and followed by a word or an underscore-delimited list of
+    words, in lowercase letters, that describes the function.  If applicable,
+    they should be declared 'static'.
+
+4.  Variable names must be meaningful.  One letter variable names must be
+    avoided, except for places where the variable has no real meaning or
+    a trivial meaning (e.g. for (i=0; i<100; i++) ...).
+
+5.  Variable names should be in lowercase.  Use underscores to separate
+    between words.
+
+6.  Method names follow the 'studlyCaps' (also referred to as 'bumpy case'
+    or 'camel caps') naming convention, with care taken to minimize the
+    letter count. The initial letter of the name is lowercase, and each
+    letter that starts a new 'word' is capitalized::
+
+    Good:
+    'connect()'
+    'getData()'
+    'buildSomeWidget()'
+
+    Bad:
+    'get_Data()'
+    'buildsomewidget'
+    'getI()'
+
+7.  Class names should be descriptive nouns in PascalCase and as short as
+    possible. Each word in the class name should start with a capital letter,
+    without underscore delimiters. The class name should be prefixed with the
+    name of the "parent set" (e.g. the name of the extension) if no namespaces
+    are used. Abbreviations and acronyms as well as initialisms should be
+    avoided wherever possible, unless they are much more widely used than the
+    long form (e.g. HTTP or URL). Abbreviations start with a capital letter
+    followed by lowercase letters, whereas acronyms and initialisms are written
+    according to their standard notation. Usage of acronyms and initialisms is
+    not allowed if they are not widely adopted and recognized as such.
+
+    Good:
+    'Curl'
+    'CurlResponse'
+    'HTTPStatusCode'
+    'URL'
+    'BTreeMap' (B-tree Map)
+    'Id' (Identifier)
+    'ID' (Identity Document)
+    'Char' (Character)
+    'Intl' (Internationalization)
+    'Radar' (Radio Detecting and Ranging)
+
+    Bad:
+    'curl'
+    'curl_response'
+    'HttpStatusCode'
+    'Url'
+    'BtreeMap'
+    'ID' (Identifier)
+    'CHAR'
+    'INTL'
+    'RADAR' (Radio Detecting and Ranging)
+
+Internal Function Naming Conventions
+----------------------
+
+1.  Functions that are part of the external API should be named
+    'php_modulename_function()' to avoid symbol collision. They should be in
+    lowercase, with words underscore delimited. Exposed API must be defined
+    in 'php_modulename.h'.
+
+    PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS);
+
+    Unexposed module function should be static and should not be defined in
+    'php_modulename.h'.
+
+    static int php_session_destroy()
+
+2.  Main module source file must be named 'modulename.c'.
+
+3.  Header file that is used by other sources must be named 'php_modulename.h'.
+
+
+Syntax and indentation
+----------------------
+
+1.  Never use C++ style comments (i.e. // comment).  Always use C-style
+    comments instead.  PHP is written in C, and is aimed at compiling
+    under any ANSI-C compliant compiler.  Even though many compilers
+    accept C++-style comments in C code, you have to ensure that your
+    code would compile with other compilers as well.
+    The only exception to this rule is code that is Win32-specific,
+    because the Win32 port is MS-Visual C++ specific, and this compiler
+    is known to accept C++-style comments in C code.
+
+2.  Use K&R-style.  Of course, we can't and don't want to
+    force anybody to use a style he or she is not used to, but,
+    at the very least, when you write code that goes into the core
+    of PHP or one of its standard modules, please maintain the K&R
+    style.  This applies to just about everything, starting with
+    indentation and comment styles and up to function declaration
+    syntax. Also see Indentstyle.
+
+    Indentstyle: http://www.catb.org/~esr/jargon/html/I/indent-style.html
+
+3.  Be generous with whitespace and braces.  Keep one empty line between the
+    variable declaration section and the statements in a block, as well as
+    between logical statement groups in a block.  Maintain at least one empty
+    line between two functions, preferably two.  Always prefer::
+
+    if (foo) {
+        bar;
+    }
+
+    to:
+
+    if(foo)bar;
+
+4.  When indenting, use the tab character.  A tab is expected to represent
+    four spaces.  It is important to maintain consistency in indenture so
+    that definitions, comments, and control structures line up correctly.
+
+5.  Preprocessor statements (#if and such) MUST start at column one. To
+    indent preprocessor directives you should put the # at the beginning
+    of a line, followed by any number of whitespace.
+
+Testing
+-------
+
+1.  Extensions should be well tested using *.phpt tests. Read about that
+    in README.TESTING.
+
+Documentation and Folding Hooks
+-------------------------------
+
+In order to make sure that the online documentation stays in line with
+the code, each user-level function should have its user-level function
+prototype before it along with a brief one-line description of what the
+function does.  It would look like this::
+
+  /* {{{ proto int abs(int number)
+     Returns the absolute value of the number */
+  PHP_FUNCTION(abs)
+  {
+     ...
+  }
+  /* }}} */
+
+The {{{ symbols are the default folding symbols for the folding mode in
+Emacs and vim (set fdm=marker).  Folding is very useful when dealing with
+large files because you can scroll through the file quickly and just unfold
+the function you wish to work on.  The }}} at the end of each function marks
+the end of the fold, and should be on a separate line.
+
+The "proto" keyword there is just a helper for the doc/genfuncsummary script
+which generates a full function summary.  Having this keyword in front of the
+function prototypes allows us to put folds elsewhere in the code without
+messing up the function summary.
+
+Optional arguments are written like this::
+
+  /* {{{ proto object imap_header(int stream_id, int msg_no [, int from_length [, int subject_length [, string default_host]]])
+     Returns a header object with the defined parameters */
+
+And yes, please keep the prototype on a single line, even if that line
+is massive.
+
+New and Experimental Functions
+-----------------------------------
+To reduce the problems normally associated with the first public
+implementation of a new set of functions, it has been suggested
+that the first implementation include a file labeled 'EXPERIMENTAL'
+in the function directory, and that the functions follow the
+standard prefixing conventions during their initial implementation.
+
+The file labelled 'EXPERIMENTAL' should include the following
+information::
+
+  Any authoring information (known bugs, future directions of the module).
+  Ongoing status notes which may not be appropriate for Git comments.
+
+In general new features should go to PECL or experimental branches until
+there are specific reasons for directly adding it to the core distribution.
+
+Aliases & Legacy Documentation
+-----------------------------------
+You may also have some deprecated aliases with close to duplicate
+names, for example, somedb_select_result and somedb_selectresult. For
+documentation purposes, these will only be documented by the most
+current name, with the aliases listed in the documentation for
+the parent function. For ease of reference, user-functions with
+completely different names, that alias to the same function (such as
+highlight_file and show_source), will be separately documented. The
+proto should still be included, describing which function is aliased.
+
+Backwards compatible functions and names should be maintained as long
+as the code can be reasonably be kept as part of the codebase. See the
+README in the PHP documentation repository for more information on
+documentation.

+ 78 - 0
EVSE/GPL/php-7.3.28/CONTRIBUTING.md

@@ -0,0 +1,78 @@
+# Contributing to PHP
+
+Anybody who programs in PHP can be a contributing member of the community that
+develops and deploys it; the task of deploying PHP, documentation and
+associated websites is a never ending one. With every release, or release
+candidate comes a wave of work, which takes a lot of organization and
+co-ordination.
+
+## Pull requests
+
+PHP welcomes pull requests to [add tests](#writing-tests), fix bugs and to
+implement RFCs. Please be sure to include tests as appropriate!
+
+If you are fixing a bug, then please submit your PR against the lowest actively
+supported branch of PHP that the bug affects (only green branches on
+[the supported version page](http://php.net/supported-versions.php) are supported).
+For example, at the time of writing in early-2018, the lowest supported version is
+PHP 7.1, which corresponds to the `PHP-7.1` branch in Git. Please also make sure you
+add a link to the PR in the bug on [the bug tracker](https://bugs.php.net/).
+
+Pull requests implementing RFCs should be submitted against `master`.
+
+Pull requests should *never* be submitted against `PHP-x.y.z` branches, as
+these are only used for release management.
+
+If your pull request exhibits conflicts with the base branch, please resolve them
+by using `git rebase` instead of `git merge`.
+
+## Filing bugs
+
+Bugs can be filed on the [PHP bug tracker](https://bugs.php.net/). If this is
+the first time you've filed a bug, we suggest reading the
+[guide to reporting a bug](https://bugs.php.net/how-to-report.php).
+
+Where possible, please include a self-contained reproduction case!
+
+## Feature requests
+
+Feature requests are generally submitted in the form of
+[Requests for Comment](https://wiki.php.net/rfc/howto), ideally accompanied by
+[pull requests](#pull-requests). You can find the extremely large list of RFCs
+that have been previously considered on the
+[PHP Wiki](https://wiki.php.net/rfc).
+
+You may want to read
+[The Mysterious PHP RFC Process](https://blogs.oracle.com/opal/entry/the_mysterious_php_rfc_process)
+for additional notes on the best way to approach submitting an RFC.
+
+## Writing tests
+
+We love getting new tests! PHP is a huge project and improving code coverage is
+a huge win for every PHP user.
+
+[Our QA site includes a page detailing how to write test cases.](http://qa.php.net/write-test.php)
+Please note that the section on submitting pull requests is outdated: in
+addition to the process listed there, you can also
+[submit pull requests](#pull-requests).
+
+## Writing documentation
+
+There are two ways to contribute to the PHP manual. You can edit the manual and
+send patches anonymously via [the online editor](https://edit.php.net/), or you
+can check the XML source out from Subversion and edit that and build it
+[per the instructions on the documentation site](http://doc.php.net/tutorial/).
+Patches created that way should be sent to the
+[documentation mailing list](mailto:phpdoc@lists.php.net).
+
+## Getting help
+
+If you are having trouble contributing to PHP, or just want to talk to a human
+about what you're working on, you can contact us via the
+[internals mailing list](mailto:internals@lists.php.net), or the
+[documentation mailing list](mailto:phpdoc@lists.php.net) for documentation
+issues.
+
+Although not a formal channel, you can also find a number of core developers on
+the #php.pecl channel on [EFnet](http://www.efnet.org/). Similarly, many
+documentation writers can be found on #php.doc.

+ 3 - 0
EVSE/GPL/php-7.3.28/CREDITS

@@ -0,0 +1,3 @@
+For the list of people who've put work into PHP, please see
+
+https://www.php.net/credits.php

+ 511 - 0
EVSE/GPL/php-7.3.28/EXTENSIONS

@@ -0,0 +1,511 @@
+                     List of PHP maintainers
+                     =======================
+
+Maintenance legend
+------------------
+    Maintained:      Someone actually looks after it.
+    Odd Fixes:       It has a maintainer but they don't have time to do
+                     much other than throw the odd patch in. See below.
+    Orphan:          No current maintainer [but maybe you could take the
+                     role as you write your new code].
+    Obsolete:        Old code. Something tagged obsolete generally means
+                     it has been replaced by a better system and you
+                     should be using that.
+    Unknown:         Not known at this time.
+
+Status legend
+-------------
+    Working:         Working under both Windows and Unix.
+    Windows:         Working only under Windows.
+    Unix:            Working only under Unix.
+    Experimental:    Under development or initial release.
+    Not Working:     Not working.
+    Unknown:         Status unknown.
+
+
+== Server APIs ==
+
+-------------------------------------------------------------------------------
+EXTENSION:           apache2handler
+PRIMARY MAINTAINER:  Aaron Bannert <aaron@php.net>, Ilia Alshanetsky <iliaa@php.net>
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           cgi
+MAINTENANCE:         Unknown
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           cli
+MAINTENANCE:         Marcus Börger <helly@php.net>, Edin Kadribasic <edink@php.net>
+STATUS:              Working
+SINCE:               4.3.0
+-------------------------------------------------------------------------------
+EXTENSION:           embed
+PRIMARY MAINTAINER:  Edin Kadribasic <edink@php.net>
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           fpm
+PRIMARY MAINTAINER:  Jakub Zelenka <bukka@php.net>
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.3.3
+-------------------------------------------------------------------------------
+EXTENSION:           litespeed
+PRIMARY MAINTAINER:  George Wang <gwang@php.net>
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.3
+-------------------------------------------------------------------------------
+EXTENSION:           phpdbg
+MAINTENANCE:         Joe Watkins <krakjoe@php.net>, Bob Weinand <bwoebi@php.net>
+STATUS:              5.6
+-------------------------------------------------------------------------------
+
+
+== Database extensions ==
+
+-------------------------------------------------------------------------------
+EXTENSION:           dba
+PRIMARY MAINTAINER:  Marcus Börger <helly@php.net> (2002 - 2007)
+                     Christopher Jones <sixd@php.net> (2008 - 2013)
+                     Pierre-Alain Joye <pajoye@php.net> (2011 - 2011)
+MAINTENANCE:         Maintained
+STATUS:              Working
+COMMENT:             DBM abstraction for db2, db3, db4, dbm, ndbm, gdbm, ini
+-------------------------------------------------------------------------------
+EXTENSION:           interbase
+PRIMARY MAINTAINER:  Ard Biesheuvel <ard@ard.nu> (2003 - 2005)
+MAINTENANCE:         Odd fixes
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           mysqli
+PRIMARY MAINTAINER:  Georg Richter <georg@php.net> (2003 - 2006)
+                     Andrey Hristov <andrey@php.net> (2003 - 2016)
+                     Johannes Schlüter <johannes@php.net> (2008 - 2014)
+                     Ulf Wendel <uw@php.net> (2007 - 2013)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.0
+-------------------------------------------------------------------------------
+EXTENSION:           mysqlnd
+PRIMARY MAINTAINER:  Andrey Hristov <andrey@php.net> (2007 - 2017)
+                     Johannes Schlüter <johannes@php.net> (2008 - 2018)
+                     Ulf Wendel <uw@php.net> (2009 - 2011)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.3
+-------------------------------------------------------------------------------
+EXTENSION:           oci8
+PRIMARY MAINTAINER:  Christopher Jones <sixd@php.net> (2007 - 2017)
+                     Antony Dovgal <tony2001@php.net> (2003 - 2009)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           odbc
+PRIMARY MAINTAINER:  Daniel R. Kalowsky <kalowsky@php.net> (2000 - 2004)
+MAINTENANCE:         Maintained
+STATUS:              Working
+COMMENT:             Working
+-------------------------------------------------------------------------------
+EXTENSION:           pdo
+PRIMARY MAINTAINER:  Ilia Alshanetsky <iliaa@php.net> (2004 - 2011)
+                     Wez Furlong <wez@php.net> (2004 - 2006)
+MAINTENANCE:         Odd fixes
+STATUS:              Working
+SINCE:               5.1
+-------------------------------------------------------------------------------
+EXTENSION:           pdo_dblib
+PRIMARY MAINTAINER:  Adam Baratz <adambaratz@php.net> (2016 - 2017)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.1
+-------------------------------------------------------------------------------
+EXTENSION:           pdo_firebird
+PRIMARY MAINTAINER:  Lars Westermann <lwe@php.net> (2007 - 2007)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.1
+-------------------------------------------------------------------------------
+EXTENSION:           pdo_mysql
+PRIMARY MAINTAINER:  Ilia Alshanetsky <iliaa@php.net> (2004 - 2010)
+                     Johannes Schlüter <johannes@php.net> (2008 - 2014)
+                     Andrey Hristov <andrey@php.net> (2005 - 2015)
+                     Ulf Wendel <uw@php.net> (2008 - 2012)
+MAINTENANCE:         Odd fixes
+STATUS:              Working
+SINCE:               5.1
+-------------------------------------------------------------------------------
+EXTENSION:           pdo_odbc
+PRIMARY MAINTAINER:  Unknown
+MAINTENANCE:         Odd fixes
+STATUS:              Working
+SINCE:               5.1
+-------------------------------------------------------------------------------
+EXTENSION:           pdo_oci
+PRIMARY MAINTAINER:  Christopher Jones <sixd@php.net> (2007 - 2017)
+MAINTENANCE:         Odd fixes
+STATUS:              Working
+SINCE:               5.1
+-------------------------------------------------------------------------------
+EXTENSION:           pdo_pgsql
+PRIMARY MAINTAINER:  Ilia Alshanetsky <iliaa@php.net> (2004 - 2011)
+MAINTENANCE:         Odd fixes
+STATUS:              Working
+SINCE:               5.1
+-------------------------------------------------------------------------------
+EXTENSION:           pdo_sqlite
+PRIMARY MAINTAINER:  Ilia Alshanetsky <iliaa@php.net> (2005 - 2011)
+MAINTENANCE:         Odd fixes
+STATUS:              Working
+SINCE:               5.1
+-------------------------------------------------------------------------------
+EXTENSION:           pgsql
+PRIMARY MAINTAINER:  Marcus Börger <helly@php.net> (2002 - 2007)
+                     Yasuo Ohgaki <yohgaki@php.net> (2001 - 2015)
+MAINTENANCE:         Maintained
+STATUS:              Working
+COMMENT:             Use PostgreSQL 7.0.x or later. PostgreSQL 6.5.3 or less have fatal bug.
+-------------------------------------------------------------------------------
+EXTENSION:           sqlite3
+PRIMARY MAINTAINER:  Scott MacVicar <scottmac@php.net> (2008 - 2011)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.3
+COMMENT:             Integrates SQLite 3 embeddable SQL database engine.
+-------------------------------------------------------------------------------
+
+
+== XML extensions ==
+
+-------------------------------------------------------------------------------
+EXTENSION:           dom
+PRIMARY MAINTAINER:  Christian Stocker <chregu@php.net> (2003 - 2011)
+                     Rob Richards <rrichards@php.net> (2003 - 2012)
+                     Marcus Börger <helly@php.net> (2003 - 2006)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.0
+-------------------------------------------------------------------------------
+EXTENSION:           simplexml
+PRIMARY MAINTAINER:  Marcus Börger <helly@php.net> (2003 - 2008)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.0
+-------------------------------------------------------------------------------
+EXTENSION:           soap
+PRIMARY MAINTAINER:  Dmitry Stogov <dmitry@php.net> (2004 - 2018)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           wddx
+PRIMARY MAINTAINER:  Andrei Zmievski <andrei@php.net> (1999 - 2003)
+MAINTENANCE:         Orphaned
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           xml
+PRIMARY MAINTAINER:  Thies C. Arntzen <thies@thieso.net> (1999 - 2002)
+                     Rob Richards <rrichards@php.net> (2003 - 2013)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           libxml
+PRIMARY MAINTAINER:  Rob Richards <rrichards@php.net> (2003 - 2009)
+                     Christian Stocker <chregu@php.net> (2004 - 2011)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           xmlreader
+PRIMARY MAINTAINER:  Rob Richards <rrichards@php.net>, Christian Stocker <chregu@php.net>
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           xmlrpc
+PRIMARY MAINTAINER:  Unknown
+MAINTENANCE:         Orphaned
+STATUS:              Experimental
+-------------------------------------------------------------------------------
+EXTENSION:           xmlwriter
+PRIMARY MAINTAINER:  Rob Richards <rrichards@php.net> (2004 - 2010)
+                     Christian Stocker <chregu@php.net> (2004 - 2004)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           xsl
+PRIMARY MAINTAINER:  Christian Stocker <chregu@php.net> (2003 - 2011)
+                     Rob Richards <rrichards@php.net> (2003 - 2010)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.0
+-------------------------------------------------------------------------------
+
+
+== Other extensions ==
+
+-------------------------------------------------------------------------------
+EXTENSION:           bcmath
+MAINTENANCE:         Andi Gutmans <andi@php.net> (2000 - 2004)
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           bz2
+PRIMARY MAINTAINER:  Hartmut Holzgraefe <hholzgra@php.net> (2004 - 2004)
+MAINTENANCE:         Odd Fixes
+STATUS:              Working
+SINCE:               4.0.3
+-------------------------------------------------------------------------------
+EXTENSION:           calendar
+PRIMARY MAINTAINER:  Hartmut Holzgraefe <hholzgra@php.net> (2000 - 2004)
+MAINTENANCE:         Odd Fixes
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           com_dotnet
+PRIMARY MAINTAINER:  Wez Furlong <wez@php.net> (2003 - 2005)
+MAINTENANCE:         Maintained
+STATUS:              Windows
+SINCE:               5.0
+-------------------------------------------------------------------------------
+EXTENSION:           ctype
+PRIMARY MAINTAINER:  Hartmut Holzgraefe <hholzgra@php.net> (2000 - 2004)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           curl
+PRIMARY MAINTAINER:  Sterling Hughes <sterling@php.net> (2000 - 2004)
+                     Ilia Alshanetsky <iliaa@php.net> (2002 - 2011)
+                     Pierrick Charron <pierrick@php.net> (2010 - 2016)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               4.0.2
+-------------------------------------------------------------------------------
+EXTENSION:           date
+PRIMARY MAINTAINER:  Derick Rethans <derick@php.net> (2005 - 2018)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           enchant
+PRIMARY MAINTAINER:  Unknown
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.3
+-------------------------------------------------------------------------------
+EXTENSION:           exif
+PRIMARY MAINTAINER:  Kalle Sommer Nielsen <kalle@php.net> (2010 - 2018)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               4.2
+-------------------------------------------------------------------------------
+EXTENSION:           fileinfo
+PRIMARY MAINTAINER:  Derick Rethans <derick@php.net> (2004 - 2008)
+                     Anatol Belski <ab@php.net> (2012 - 2018)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.3
+-------------------------------------------------------------------------------
+EXTENSION:           filter
+PRIMARY MAINTAINER:  Derick Rethans <derick@php.net> (2006 - 2006)
+                     Pierre-Alain Joye <pajoye@php.net> (2006 - 2011)
+                     Ilia Alshanetsky <iliaa@php.net> (2006 - 2011)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.2
+-------------------------------------------------------------------------------
+EXTENSION:           ftp
+PRIMARY MAINTAINER:  Unknown
+MAINTENANCE:         Odd fixes
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           gd
+PRIMARY MAINTAINER:  Pierre-Alain Joye <pajoye@php.net> (2002 - 2016)
+                     Christoph M. Becker <cmb@php.net> (2015 - 2018)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           gettext
+MAINTENANCE:         Unknown
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           gmp
+PRIMARY MAINTAINER:  Stanislav Malyshev <stas@php.net> (2000 - 2018)
+                     Antony Dovgal <tony2001@php.net> (2005 - 2010)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               4.0.4
+-------------------------------------------------------------------------------
+EXTENSION:           hash
+PRIMARY MAINTAINER:  Sara Golemon <pollita@php.net> (2005 - 2017)
+                     Mike Wallner <mike@php.net> (2005 - 2013)
+                     Anatol Belski <ab@php.net> (2014 - 2018)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.1.2
+-------------------------------------------------------------------------------
+EXTENSION:           iconv
+PRIMARY MAINTAINER:  Moriyoshi Koizumi <moriyoshi@php.net> (2002 - 2010)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           intl
+PRIMARY MAINTAINER:  Stanislav Malyshev <stas@php.net> (2008 - 2018)
+                     Anatol Belski <ab@php.net> (2017 - 2018)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.3
+-------------------------------------------------------------------------------
+EXTENSION:           imap
+PRIMARY MAINTAINER:  Chuck Hagenbuch <chuck@horde.org> (1999 - 2004)
+                     Ilia Alshanetsky <iliaa@php.net> (2002 - 2010)
+                     Pierre-Alain Joye <pajoye@php.net> (2008 - 2010)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           json
+PRIMARY MAINTAINER:  Jakub Zelenka <bukka@php.net> (2014 - 2018)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.2
+-------------------------------------------------------------------------------
+EXTENSION:           ldap
+PRIMARY MAINTAINER:  Stig Venaas <venaas@php.net> (2000 - 2002)
+                     Douglas Goldstein <cardoe@php.net> (2007 - 2007)
+                     Pierre-Alain Joye <pajoye@php.net> (2008 - 2010)
+                     Côme Bernigaud <mcmic@php.net> (2015 - 2017)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           mbstring
+PRIMARY MAINTAINER:  Rui Hirokawa <hirokawa@php.net> (2001 - 2013)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           opcache
+PRIMARY MAINTAINER:  Dmitry Stogov <dmitry@php.net> (2013 - 2018)
+                     Xinchen Hui <laruence@php.net> (2013 - 2018)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.5.0
+-------------------------------------------------------------------------------
+EXTENSION:           openssl
+PRIMARY MAINTAINER:  Wez Furlong <wez@php.net> (2001 - 2006)
+                     Pierre-Alain Joye <pajoye@php.net> (2006 - 2011)
+                     Jakub Zelenka <bukka@php.net> (2015 - 2019)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               4.0.4
+-------------------------------------------------------------------------------
+EXTENSION:           pcntl
+PRIMARY MAINTAINER:  Arnaud Le Blanc <lbarnaud@php.net> (2008 - 2010)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           pcre
+PRIMARY MAINTAINER:  Andrei Zmievski <andrei@php.net> (1999 - 2006)
+                     Nuno Lopes <nlopess@php.net> (2006 - 2009)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           phar
+PRIMARY MAINTAINER:  Greg Beaver <cellog@php.net> (2008 - 2009)
+                     Marcus Börger <helly@php.net> (2008 - 2008)
+                     Steph Fox <sfox@php.net> (2008 - 2008)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.3
+-------------------------------------------------------------------------------
+EXTENSION:           posix
+PRIMARY MAINTAINER:  Kristian Köhntopp <kris@koehntopp.de> (2000 - 2000)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           pspell
+PRIMARY MAINTAINER:  Vlad Krupin <phpdevel@echospace.com> (2000 - 2004)
+MAINTENANCE:         Unknown
+STATUS:              Working
+SINCE:               4.0.2
+-------------------------------------------------------------------------------
+EXTENSION:           readline
+MAINTENANCE:         Unknown
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           recode
+PRIMARY MAINTAINER:  Kristian Köhntopp <kris@koehntopp.de> (2000 - 2000)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           reflection
+PRIMARY MAINTAINER:  Marcus Börger <helly@php.net> (2003 - 2009)
+                     Johannes Schlüter <johannes@php.net> (2006 - 2014)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           session
+PRIMARY MAINTAINER:  Sascha Schumann <sascha@schumann.cx> (1999 - 2004)
+                     Ilia Alshanetsky <iliaa@php.net> (2002 - 2012)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           shmop
+PRIMARY MAINTAINER:  Ilia Alshanetsky <iliaa@php.net> (2002 - 2008)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               4.0.3
+-------------------------------------------------------------------------------
+EXTENSION:           snmp
+PRIMARY MAINTAINER:  Boris Lytochkin <lytboris@php.net> (2011 - 2013)
+                     Rasmus Lerdorf <rasmus@php.net> (1999 - 2002)
+                     Pierre-Alain Joye <pajoye@php.net> (2010 - 2011)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           sockets
+PRIMARY MAINTAINER:  Chris Vandomelen <chrisv@b0rked.dhs.org> (2000 - 2000)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               4.0.2
+-------------------------------------------------------------------------------
+EXTENSION:           sodium
+PRIMARY MAINTAINER:  Frank Denis <jedisct1@php.net> (2017 - 2017)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               7.2.0
+-------------------------------------------------------------------------------
+EXTENSION:           spl
+PRIMARY MAINTAINER:  Marcus Börger <helly@php.net> (2003 - 2009)
+                     Etienne Kneuss <colder@php.net> (2008 - 2014)
+MAINTENANCE:         Maintained
+STATUS:              Working
+SINCE:               5.0.0
+-------------------------------------------------------------------------------
+EXTENSION:           sysvmsg
+MAINTENANCE:         Unknown
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           sysvsem
+MAINTENANCE:         Unknown
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           sysvshm
+MAINTENANCE:         Unknown
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           tidy
+PRIMARY MAINTAINER:  John Coggeshall <john@php.net> (2003 - 2006)
+                     Ilia Alshanetsky <iliaa@php.net> (2003 - 2009)
+                     Nuno Lopes <nlopess@php.net> (2006 - 2012)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           tokenizer
+PRIMARY MAINTAINER:  Andrei Zmievski <andrei@php.net> (2002 - 2002)
+MAINTENANCE:         Unknown
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           zip
+PRIMARY MAINTAINER:  Pierre-Alain Joye <pajoye@php.net> (2006 - 2011)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------
+EXTENSION:           zlib
+PRIMARY MAINTAINER:  Stefan Roehrich <sr@linux.de> (1999 - 2003)
+MAINTENANCE:         Maintained
+STATUS:              Working
+-------------------------------------------------------------------------------

+ 3 - 0
EVSE/GPL/php-7.3.28/INSTALL

@@ -0,0 +1,3 @@
+For installation of PHP, please refer to the online documentation available at:
+
+https://php.net/install

+ 68 - 0
EVSE/GPL/php-7.3.28/LICENSE

@@ -0,0 +1,68 @@
+--------------------------------------------------------------------
+                  The PHP License, version 3.01
+Copyright (c) 1999 - 2018 The PHP Group. All rights reserved.
+--------------------------------------------------------------------
+
+Redistribution and use in source and binary forms, with or without
+modification, is permitted provided that the following conditions
+are met:
+
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+
+  3. The name "PHP" must not be used to endorse or promote products
+     derived from this software without prior written permission. For
+     written permission, please contact group@php.net.
+
+  4. Products derived from this software may not be called "PHP", nor
+     may "PHP" appear in their name, without prior written permission
+     from group@php.net.  You may indicate that your software works in
+     conjunction with PHP by saying "Foo for PHP" instead of calling
+     it "PHP Foo" or "phpfoo"
+
+  5. The PHP Group may publish revised and/or new versions of the
+     license from time to time. Each version will be given a
+     distinguishing version number.
+     Once covered code has been published under a particular version
+     of the license, you may always continue to use it under the terms
+     of that version. You may also choose to use such covered code
+     under the terms of any subsequent version of the license
+     published by the PHP Group. No one other than the PHP Group has
+     the right to modify the terms applicable to covered code created
+     under this License.
+
+  6. Redistributions of any form whatsoever must retain the following
+     acknowledgment:
+     "This product includes PHP software, freely available from
+     <http://www.php.net/software/>".
+
+THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND
+ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE PHP
+DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--------------------------------------------------------------------
+
+This software consists of voluntary contributions made by many
+individuals on behalf of the PHP Group.
+
+The PHP Group can be contacted via Email at group@php.net.
+
+For more information on the PHP Group and the PHP project,
+please see <http://www.php.net>.
+
+PHP includes the Zend Engine, freely available at
+<http://www.zend.com>.

+ 22 - 0
EVSE/GPL/php-7.3.28/Makefile.frag

@@ -0,0 +1,22 @@
+#
+# Zend
+#
+
+$(builddir)/zend_language_scanner.lo: $(srcdir)/zend_language_parser.h
+$(builddir)/zend_ini_scanner.lo: $(srcdir)/zend_ini_parser.h
+
+$(srcdir)/zend_language_scanner.c: $(srcdir)/zend_language_scanner.l
+	@(cd $(top_srcdir); $(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt Zend/zend_language_scanner_defs.h -oZend/zend_language_scanner.c Zend/zend_language_scanner.l)
+
+$(srcdir)/zend_language_parser.h: $(srcdir)/zend_language_parser.c
+$(srcdir)/zend_language_parser.c: $(srcdir)/zend_language_parser.y
+	@$(YACC) -p zend -v -d $(srcdir)/zend_language_parser.y -o $@
+
+$(srcdir)/zend_ini_parser.h: $(srcdir)/zend_ini_parser.c
+$(srcdir)/zend_ini_parser.c: $(srcdir)/zend_ini_parser.y
+	@$(YACC) -p ini_ -v -d $(srcdir)/zend_ini_parser.y -o $@
+
+$(srcdir)/zend_ini_scanner.c: $(srcdir)/zend_ini_scanner.l
+	@(cd $(top_srcdir); $(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt Zend/zend_ini_scanner_defs.h -oZend/zend_ini_scanner.c Zend/zend_ini_scanner.l)
+
+$(builddir)/zend_highlight.lo $(builddir)/zend_compile.lo: $(srcdir)/zend_language_parser.h

+ 78 - 0
EVSE/GPL/php-7.3.28/Makefile.gcov

@@ -0,0 +1,78 @@
+#
+# LCOV
+#
+
+LCOV_INCLUDE="."
+
+lcov: lcov-html
+
+lcov-test: lcov-clean-data test
+
+php_lcov.info: lcov-test
+	@echo "Generating data for $@"
+	@rm -rf lcov_data/
+	@$(mkinstalldirs) lcov_data/
+	@echo
+	-@files=`find . -name \*.gcda -o -name \*.gcno -o -name \*.da -o -name \*.c -o -name \*.h | sed -e 's/^\.\///' | sed -e 's/\.gcda//g' -e 's/\.gcno//g' -e 's/\.da//g' | $(EGREP) $(LCOV_INCLUDE) | sed -e 's/.libs/zzzz/g' | sort | sed -e 's/zzzz/.libs/g' | uniq` ;\
+	for x in $$files; do \
+		echo -n . ;\
+		y=`echo $$x | sed -e 's!\.libs/!!'`; \
+		dir=lcov_data/`dirname $$x`; \
+		test -d "$$dir" || $(mkinstalldirs) "$$dir"; \
+		if test -f "$(top_srcdir)/$$y.c"; then \
+			ln -f -s $(top_srcdir)/$$y.c lcov_data/$$y.c; \
+		fi; \
+		if test -f "$(top_srcdir)/$$y.h"; then \
+			ln -f -s $(top_srcdir)/$$y.h lcov_data/$$y.h; \
+		fi; \
+		if test -f "$(top_srcdir)/$$y.re"; then \
+			ln -f -s $(top_srcdir)/$$y.re lcov_data/$$y.re; \
+		fi; \
+		if test -f "$(top_srcdir)/$$y.y"; then \
+		        ln -f -s $(top_srcdir)/$$y.y lcov_data/$$y.y; \
+		fi; \
+		if test -f "$(top_srcdir)/$$y.l"; then \
+		        ln -f -s $(top_srcdir)/$$y.l lcov_data/$$y.l; \
+		fi; \
+		if test -f "$(top_srcdir)/$$y"; then \
+		        ln -f -s $(top_srcdir)/$$y lcov_data/$$y; \
+		fi; \
+		if test -f "$(top_builddir)/$$y.c"; then \
+			ln -f -s $(top_builddir)/$$y.c lcov_data/$$y.c; \
+		fi; \
+		if test -f "$$x.gcno"; then \
+			cp $$x.gcno lcov_data/$$y.gcno ; \
+		fi; \
+		if test -f "$$x.gcda"; then \
+			cp $$x.gcda lcov_data/$$y.gcda ; \
+		fi; \
+		if test -f "$$x.da"; then \
+			cp $$x.da   lcov_data/$$y.da ; \
+		fi; \
+		if test -f "$$x.bb"; then \
+			cp $$x.bb   lcov_data/$$y.bb ; \
+		fi; \
+		if test -f "$$x.bbg"; then \
+			cp $$x.bbg  lcov_data/$$y.bbg ; \
+		fi; \
+	done; \
+	for dir in ext/bcmath/libbcmath ext/date/lib ext/fileinfo/libmagic ext/gd/libgd ext/mbstring/libmbfl ext/mbstring/oniguruma ext/pcre/pcrelib ext/pdo_sqlite/libsqlite ext/sqlite3/libsqlite ext/xmlrpc/libxmlrpc ext/zip/lib; do \
+		if test -d lcov_data/$$dir; then \
+			rm -rf lcov_data/$$dir ; \
+		fi; \
+	done
+	@echo
+	@echo "Generating $@"
+	@$(LTP) --directory lcov_data/ --capture --base-directory=lcov_data --output-file $@
+
+lcov-html: php_lcov.info
+	@echo "Generating lcov HTML"
+	@$(LTP_GENHTML) --legend --output-directory lcov_html/ --title "PHP Code Coverage" php_lcov.info
+
+lcov-clean:
+	rm -f php_lcov.info
+	rm -rf lcov_data/
+	rm -rf lcov_html/
+
+lcov-clean-data:
+	@find . -name \*.gcda -o -name \*.da -o -name \*.bbg? | xargs rm -f

+ 147 - 0
EVSE/GPL/php-7.3.28/Makefile.global

@@ -0,0 +1,147 @@
+mkinstalldirs = $(top_srcdir)/build/shtool mkdir -p
+INSTALL = $(top_srcdir)/build/shtool install -c
+INSTALL_DATA = $(INSTALL) -m 644
+
+DEFS = -DPHP_ATOM_INC -I$(top_builddir)/include -I$(top_builddir)/main -I$(top_srcdir)
+COMMON_FLAGS = $(DEFS) $(INCLUDES) $(EXTRA_INCLUDES) $(CPPFLAGS) $(PHP_FRAMEWORKPATH)
+
+all: $(all_targets)
+	@echo
+	@echo "Build complete."
+	@echo "Don't forget to run 'make test'."
+	@echo
+
+build-modules: $(PHP_MODULES) $(PHP_ZEND_EX)
+
+build-binaries: $(PHP_BINARIES)
+
+libphp$(PHP_MAJOR_VERSION).la: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS)
+	$(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -rpath $(phptempdir) $(EXTRA_LDFLAGS) $(LDFLAGS) $(PHP_RPATHS) $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@
+	-@$(LIBTOOL) --silent --mode=install cp $@ $(phptempdir)/$@ >/dev/null 2>&1
+
+libs/libphp$(PHP_MAJOR_VERSION).bundle: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS)
+	$(CC) $(MH_BUNDLE_FLAGS) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) $(PHP_GLOBAL_OBJS:.lo=.o) $(PHP_SAPI_OBJS:.lo=.o) $(PHP_FRAMEWORKS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) -o $@ && cp $@ libs/libphp$(PHP_MAJOR_VERSION).so
+
+install: $(all_targets) $(install_targets)
+
+install-sapi: $(OVERALL_TARGET)
+	@echo "Installing PHP SAPI module:       $(PHP_SAPI)"
+	-@$(mkinstalldirs) $(INSTALL_ROOT)$(bindir)
+	-@if test ! -r $(phptempdir)/libphp$(PHP_MAJOR_VERSION).$(SHLIB_DL_SUFFIX_NAME); then \
+		for i in 0.0.0 0.0 0; do \
+			if test -r $(phptempdir)/libphp$(PHP_MAJOR_VERSION).$(SHLIB_DL_SUFFIX_NAME).$$i; then \
+				$(LN_S) $(phptempdir)/libphp$(PHP_MAJOR_VERSION).$(SHLIB_DL_SUFFIX_NAME).$$i $(phptempdir)/libphp$(PHP_MAJOR_VERSION).$(SHLIB_DL_SUFFIX_NAME); \
+				break; \
+			fi; \
+		done; \
+	fi
+	@$(INSTALL_IT)
+
+install-binaries: build-binaries $(install_binary_targets)
+
+install-modules: build-modules
+	@test -d modules && \
+	$(mkinstalldirs) $(INSTALL_ROOT)$(EXTENSION_DIR)
+	@echo "Installing shared extensions:     $(INSTALL_ROOT)$(EXTENSION_DIR)/"
+	@rm -f modules/*.la >/dev/null 2>&1
+	@$(INSTALL) modules/* $(INSTALL_ROOT)$(EXTENSION_DIR)
+
+install-headers:
+	-@if test "$(INSTALL_HEADERS)"; then \
+		for i in `echo $(INSTALL_HEADERS)`; do \
+			i=`$(top_srcdir)/build/shtool path -d $$i`; \
+			paths="$$paths $(INSTALL_ROOT)$(phpincludedir)/$$i"; \
+		done; \
+		$(mkinstalldirs) $$paths && \
+		echo "Installing header files:          $(INSTALL_ROOT)$(phpincludedir)/" && \
+		for i in `echo $(INSTALL_HEADERS)`; do \
+			if test "$(PHP_PECL_EXTENSION)"; then \
+				src=`echo $$i | $(SED) -e "s#ext/$(PHP_PECL_EXTENSION)/##g"`; \
+			else \
+				src=$$i; \
+			fi; \
+			if test -f "$(top_srcdir)/$$src"; then \
+				$(INSTALL_DATA) $(top_srcdir)/$$src $(INSTALL_ROOT)$(phpincludedir)/$$i; \
+			elif test -f "$(top_builddir)/$$src"; then \
+				$(INSTALL_DATA) $(top_builddir)/$$src $(INSTALL_ROOT)$(phpincludedir)/$$i; \
+			else \
+				(cd $(top_srcdir)/$$src && $(INSTALL_DATA) *.h $(INSTALL_ROOT)$(phpincludedir)/$$i; \
+				cd $(top_builddir)/$$src && $(INSTALL_DATA) *.h $(INSTALL_ROOT)$(phpincludedir)/$$i) 2>/dev/null || true; \
+			fi \
+		done; \
+	fi
+
+PHP_TEST_SETTINGS = -d 'open_basedir=' -d 'output_buffering=0' -d 'memory_limit=-1'
+PHP_TEST_SHARED_EXTENSIONS =  ` \
+	if test "x$(PHP_MODULES)" != "x"; then \
+		for i in $(PHP_MODULES)""; do \
+			. $$i; $(top_srcdir)/build/shtool echo -n -- " -d extension=$$dlname"; \
+		done; \
+	fi; \
+	if test "x$(PHP_ZEND_EX)" != "x"; then \
+		for i in $(PHP_ZEND_EX)""; do \
+			. $$i; $(top_srcdir)/build/shtool echo -n -- " -d $(ZEND_EXT_TYPE)=$(top_builddir)/modules/$$dlname"; \
+		done; \
+	fi`
+PHP_DEPRECATED_DIRECTIVES_REGEX = '^(magic_quotes_(gpc|runtime|sybase)?|(zend_)?extension(_debug)?(_ts)?)[\t\ ]*='
+
+test: all
+	@if test ! -z "$(PHP_EXECUTABLE)" && test -x "$(PHP_EXECUTABLE)"; then \
+		INI_FILE=`$(PHP_EXECUTABLE) -d 'display_errors=stderr' -r 'echo php_ini_loaded_file();' 2> /dev/null`; \
+		if test "$$INI_FILE"; then \
+			$(EGREP) -h -v $(PHP_DEPRECATED_DIRECTIVES_REGEX) "$$INI_FILE" > $(top_builddir)/tmp-php.ini; \
+		else \
+			echo > $(top_builddir)/tmp-php.ini; \
+		fi; \
+		INI_SCANNED_PATH=`$(PHP_EXECUTABLE) -d 'display_errors=stderr' -r '$$a = explode(",\n", trim(php_ini_scanned_files())); echo $$a[0];' 2> /dev/null`; \
+		if test "$$INI_SCANNED_PATH"; then \
+			INI_SCANNED_PATH=`$(top_srcdir)/build/shtool path -d $$INI_SCANNED_PATH`; \
+			$(EGREP) -h -v $(PHP_DEPRECATED_DIRECTIVES_REGEX) "$$INI_SCANNED_PATH"/*.ini >> $(top_builddir)/tmp-php.ini; \
+		fi; \
+		TEST_PHP_EXECUTABLE=$(PHP_EXECUTABLE) \
+		TEST_PHP_SRCDIR=$(top_srcdir) \
+		CC="$(CC)" \
+			$(PHP_EXECUTABLE) -n -c $(top_builddir)/tmp-php.ini $(PHP_TEST_SETTINGS) $(top_srcdir)/run-tests.php -n -c $(top_builddir)/tmp-php.ini -d extension_dir=$(top_builddir)/modules/ $(PHP_TEST_SHARED_EXTENSIONS) $(TESTS); \
+		TEST_RESULT_EXIT_CODE=$$?; \
+		rm $(top_builddir)/tmp-php.ini; \
+		exit $$TEST_RESULT_EXIT_CODE; \
+	else \
+		echo "ERROR: Cannot run tests without CLI sapi."; \
+	fi
+
+clean:
+	find . -name \*.gcno -o -name \*.gcda | xargs rm -f
+	find . -name \*.lo -o -name \*.o | xargs rm -f
+	find . -name \*.la -o -name \*.a | xargs rm -f
+	find . -name \*.so | xargs rm -f
+	find . -name .libs -a -type d|xargs rm -rf
+	rm -f libphp$(PHP_MAJOR_VERSION).la $(SAPI_CLI_PATH) $(SAPI_CGI_PATH) $(SAPI_LITESPEED_PATH) $(SAPI_FPM_PATH) $(OVERALL_TARGET) modules/* libs/*
+
+distclean: clean
+	rm -f Makefile config.cache config.log config.status Makefile.objects Makefile.fragments libtool main/php_config.h main/internal_functions_cli.c main/internal_functions.c stamp-h buildmk.stamp Zend/zend_dtrace_gen.h Zend/zend_dtrace_gen.h.bak Zend/zend_config.h TSRM/tsrm_config.h
+	rm -f php7.spec main/build-defs.h scripts/phpize
+	rm -f ext/date/lib/timelib_config.h ext/mbstring/oniguruma/config.h ext/mbstring/libmbfl/config.h ext/oci8/oci8_dtrace_gen.h ext/oci8/oci8_dtrace_gen.h.bak
+	rm -f scripts/man1/phpize.1 scripts/php-config scripts/man1/php-config.1 sapi/cli/php.1 sapi/cgi/php-cgi.1 sapi/phpdbg/phpdbg.1 ext/phar/phar.1 ext/phar/phar.phar.1
+	rm -f sapi/fpm/php-fpm.conf sapi/fpm/init.d.php-fpm sapi/fpm/php-fpm.service sapi/fpm/php-fpm.8 sapi/fpm/status.html
+	rm -f ext/iconv/php_have_bsd_iconv.h ext/iconv/php_have_glibc_iconv.h ext/iconv/php_have_ibm_iconv.h ext/iconv/php_have_iconv.h ext/iconv/php_have_libiconv.h ext/iconv/php_iconv_aliased_libiconv.h ext/iconv/php_iconv_supports_errno.h ext/iconv/php_php_iconv_h_path.h ext/iconv/php_php_iconv_impl.h
+	rm -f ext/phar/phar.phar ext/phar/phar.php
+	if test "$(srcdir)" != "$(builddir)"; then \
+	  rm -f ext/phar/phar/phar.inc; \
+	fi
+	$(EGREP) define'.*include/php' $(top_srcdir)/configure | $(SED) 's/.*>//'|xargs rm -f
+
+prof-gen:
+	CCACHE_DISABLE=1 $(MAKE) PROF_FLAGS=-fprofile-generate all
+
+prof-clean:
+	find . -name \*.lo -o -name \*.o | xargs rm -f
+	find . -name \*.la -o -name \*.a | xargs rm -f
+	find . -name \*.so | xargs rm -f
+	rm -f libphp$(PHP_MAJOR_VERSION).la $(SAPI_CLI_PATH) $(SAPI_CGI_PATH) $(SAPI_LITESPEED_PATH) $(SAPI_FPM_PATH) $(OVERALL_TARGET) modules/* libs/*
+
+prof-use:
+	CCACHE_DISABLE=1 $(MAKE) PROF_FLAGS=-fprofile-use all
+
+
+.PHONY: all clean install distclean test prof-gen prof-clean prof-use
+.NOEXPORT:

+ 2621 - 0
EVSE/GPL/php-7.3.28/NEWS

@@ -0,0 +1,2621 @@
+PHP                                                                        NEWS
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+?? ??? ????, PHP 7.3.29
+
+29 Apr 2021, PHP 7.3.28
+
+- Imap:
+  . Fixed bug #80710 (imap_mail_compose() header injection). (cmb, Stas)
+
+04 Feb 2021, PHP 7.3.27
+
+- SOAP:
+  . Fixed bug #80672 (Null Dereference in SoapClient). (CVE-2021-21702) (cmb, Stas)
+
+07 Jan 2021, PHP 7.3.26
+
+- Standard:
+  . Fixed bug #77423 (FILTER_VALIDATE_URL accepts URLs with invalid userinfo). 
+    (CVE-2020-7071) (cmb)
+  . Fixed bug #80457 (stream_get_contents() fails with maxlength=-1 or default).
+    (bruno dot premont at restena dot lu)
+
+26 Nov 2020, PHP 7.3.25
+
+- Core:
+  . Fixed bug #80280 (ADD_EXTENSION_DEP() fails for ext/standard and ext/date).
+    (cmb)
+  . Fixed bug #80258 (Windows Deduplication Enabled, randon permission errors).
+    (cmb)
+
+- COM:
+  . Fixed bug #62474 (com_event_sink crashes on certain arguments). (cmb)
+
+- DOM:
+  . Fixed bug #80268 (loadHTML() truncates at NUL bytes). (cmb)
+
+- IMAP:
+  . Fixed bug #64076 (imap_sort() does not return FALSE on failure). (cmb)
+  . Fixed bug #76618 (segfault on imap_reopen). (girgias)
+  . Fixed bug #80239 (imap_rfc822_write_address() leaks memory). (cmb)
+  . Fixed minor regression caused by fixing bug #80220. (cmb)
+  . Fixed bug #80242 (imap_mail_compose() segfaults for multipart with rfc822).
+    (cmb)
+
+- Intl:
+  . Fixed bug #80310 (ext-intl with icu4c 68.1: use of undeclared identifier
+    'TRUE'). (Alexander M. Turek)
+
+- ODBC:
+  . Fixed bug #44618 (Fetching may rely on uninitialized data). (cmb)
+
+- SNMP:
+  . Fixed bug #70461 (disable md5 code when it is not supported in net-snmp).
+    (Alexander Bergmann, cmb)
+
+- Standard:
+  . Fixed bug #80266 (parse_url silently drops port number 0). (cmb, Nikita)
+
+29 Oct 2020, PHP 7.3.24
+
+- Core:
+  . Fixed bug #79423 (copy command is limited to size of file it can copy).
+    (cmb)
+
+- Calendar:
+  . Fixed bug #80185 (jdtounix() fails after 2037). (cmb)
+
+- IMAP:
+  . Fixed bug #80213 (imap_mail_compose() segfaults on certain $bodies). (cmb)
+  . Fixed bug #80215 (imap_mail_compose() may modify by-val parameters). (cmb)
+  . Fixed bug #80220 (imap_mail_compose() may leak memory). (cmb)
+  . Fixed bug #80223 (imap_mail_compose() leaks envelope on malformed bodies).
+    (cmb)
+  . Fixed bug #80216 (imap_mail_compose() does not validate types/encodings).
+    (cmb)
+  . Fixed bug #80226 (imap_sort() leaks sortpgm memory). (cmb)
+
+- MySQLnd:
+  . Fixed bug #80115 (mysqlnd.debug doesn't recognize absolute paths with
+    slashes). (cmb)
+  . Fixed bug #80107 (mysqli_query() fails for ~16 MB long query when
+    compression is enabled). (Nikita)
+
+- ODBC:
+  . Fixed bug #78470 (odbc_specialcolumns() no longer accepts $nullable). (cmb)
+  . Fixed bug #80147 (BINARY strings may not be properly zero-terminated).
+    (cmb)
+  . Fixed bug #80150 (Failure to fetch error message). (cmb)
+  . Fixed bug #80152 (odbc_execute() moves internal pointer of $params). (cmb)
+  . Fixed bug #46050 (odbc_next_result corrupts prepared resource). (cmb)
+
+- OPcache:
+  . Fixed bug #80083 (Optimizer pass 6 removes variables used for ibm_db2 data
+    binding). (Nikita)
+
+- PDO_ODBC:
+  . Fixed bug #67465 (NULL Pointer dereference in odbc_handle_preparer). (cmb)
+
+- Standard:
+  . Fixed bug #80114 (parse_url does not accept URLs with port 0). (cmb, twosee)
+  . Fixed bug #76943 (Inconsistent stream_wrapper_restore() errors). (cmb)
+  . Fixed bug #76735 (Incorrect message in fopen on invalid mode). (cmb)
+
+- Tidy:
+  . Fixed bug #77040 (tidyNode::isHtml() is completely broken). (cmb)
+
+01 Oct 2020, PHP 7.3.23
+
+- Core:
+  . Fixed bug #80048 (Bug #69100 has not been fixed for Windows). (cmb)
+  . Fixed bug #80049 (Memleak when coercing integers to string via variadic
+    argument). (Nikita)
+  . Fixed bug #79699 (PHP parses encoded cookie names so malicious `__Host-` 
+    cookies can be sent). (CVE-2020-7070) (Stas)
+
+- Calendar:
+  . Fixed bug #80007 (Potential type confusion in unixtojd() parameter parsing).
+    (Andy Postnikov)
+
+- COM:
+  . Fixed bug #64130 (COM obj parameters passed by reference are not updated).
+    (cmb)
+
+- OPcache:
+  . Fixed bug #80002 (calc free space for new interned string is wrong).
+    (t-matsuno)
+  . Fixed bug #79825 (opcache.file_cache causes SIGSEGV when custom opcode
+    handlers changed). (SammyK)
+
+- OpenSSL:
+  . Fixed bug #79601 (Wrong ciphertext/tag in AES-CCM encryption for a 12 
+    bytes IV). (CVE-2020-7069) (Jakub Zelenka)
+
+- PDO:
+  . Fixed bug #80027 (Terrible performance using $query->fetch on queries with
+    many bind parameters). (Matteo)
+
+- SOAP:
+  . Fixed bug #47021 (SoapClient stumbles over WSDL delivered with
+    "Transfer-Encoding: chunked"). (Matteo)
+
+- Standard:
+  . Fixed bug #79986 (str_ireplace bug with diacritics characters). (cmb)
+  . Fixed bug #80077 (getmxrr test bug). (Rainer Jung)
+  . Fixed bug #72941 (Modifying bucket->data by-ref has no effect any longer).
+    (cmb)
+  . Fixed bug #80067 (Omitting the port in bindto setting errors). (cmb)
+
+03 Sep 2020, PHP 7.3.22
+
+- Core:
+  . Fixed bug #79884 (PHP_CONFIG_FILE_PATH is meaningless). (cmb)
+  . Fixed bug #77932 (File extensions are case-sensitive). (cmb)
+  . Fixed bug #79806 (realpath() erroneously resolves link to link). (cmb)
+  . Fixed bug #79895 (PHP_CHECK_GCC_ARG does not allow flags with equal sign).
+    (Santiago M. Mola)
+  . Fixed bug #79919 (Stack use-after-scope in define()). (cmb)
+  . Fixed bug #79934 (CRLF-only line in heredoc causes parsing error).
+    (Pieter van den Ham)
+
+- COM:
+  . Fixed bug #48585 (com_load_typelib holds reference, fails on second call).
+    (cmb)
+
+- Exif:
+  . Fixed bug #75785 (Many errors from exif_read_data).
+    (Níckolas Daniel da Silva)
+
+- Gettext:
+  . Fixed bug #70574 (Tests fail due to relying on Linux fallback behavior for
+    gettext()). (Florian Engelhardt)
+
+- LDAP:
+  . Fixed memory leaks. (ptomulik)
+
+- OPcache:
+  . Fixed bug #73060 (php failed with error after temp folder cleaned up).
+    (cmb)
+
+- PDO:
+  . Fixed bug #64705 (errorInfo property of PDOException is null when
+    PDO::__construct() fails). (Ahmed Abdou)
+
+- Standard:
+  . Fixed bug #79930 (array_merge_recursive() crashes when called with array
+    with single reference). (Nikita)
+  . Fixed bug #79944 (getmxrr always returns true on Alpine linux). (Nikita)
+  . Fixed bug #79951 (Memory leak in str_replace of empty string). (Nikita)
+
+- XML:
+  . Fixed bug #79922 (Crash after multiple calls to xml_parser_free()). (cmb)
+
+06 Aug 2020, PHP 7.3.21
+
+- Apache:
+  . Fixed bug #79030 (Upgrade apache2handler's php_apache_sapi_get_request_time
+    to return usec). (Herbert256)
+
+- Core:
+  . Fixed bug #79877 (getimagesize function silently truncates after a null 
+    byte) (cmb)
+  . Fixed bug #79778 (Assertion failure if dumping closure with unresolved
+    static variable). (Nikita)
+  . Fixed bug #79792 (HT iterators not removed if empty array is destroyed).
+    (Nikita)
+
+- COM:
+  . Fixed bug #63208 (BSTR to PHP string conversion not binary safe). (cmb)
+  . Fixed bug #63527 (DCOM does not work with Username, Password parameter).
+    (cmb)
+
+- Curl:
+  . Fixed bug #79741 (curl_setopt CURLOPT_POSTFIELDS asserts on object with
+    declared properties). (Nikita)
+
+- Fileinfo:
+  . Fixed bug #79756 (finfo_file crash (FILEINFO_MIME)). (cmb)
+
+- FTP:
+  . Fixed bug #55857 (ftp_size on large files). (cmb)
+
+- Mbstring:
+  . Fixed bug #79787 (mb_strimwidth does not trim string). (XXiang)
+
+- Phar:
+  . Fixed bug #79797 (Use of freed hash key in the phar_parse_zipfile
+    function). (CVE-2020-7068) (cmb)
+
+- Standard:
+  . Fixed bug #70362 (Can't copy() large 'data://' with open_basedir). (cmb)
+  . Fixed bug #79817 (str_replace() does not handle INDIRECT elements). (Nikita)
+  . Fixed bug #78008 (dns_check_record() always return true on Alpine).
+    (Andy Postnikov)
+
+09 Jul 2020, PHP 7.3.20
+
+- Core:
+  . Fixed bug #79650 (php-win.exe 100% cpu lockup). (cmb)
+  . Fixed bug #79668 (get_defined_functions(true) may miss functions). (cmb,
+    Nikita)
+  . Fixed possibly unsupported timercmp() usage. (cmb)
+
+- Exif:
+  . Fixed bug #79687 (Sony picture - PHP Warning - Make, Model, MakerNotes). 
+    (cmb)
+
+- Filter:
+  . Fixed bug #73527 (Invalid memory access in php_filter_strip). (cmb)
+
+- GD:
+  . Fixed bug #79676 (imagescale adds black border with IMG_BICUBIC). (cmb)
+
+- OpenSSL:
+  . Fixed bug #62890 (default_socket_timeout=-1 causes connection to timeout).
+    (cmb)
+
+- PDO SQLite:
+  . Fixed bug #79664 (PDOStatement::getColumnMeta fails on empty result set).
+    (cmb)
+
+- SPL:
+  . Fixed bug #79710 (Reproducible segfault in error_handler during GC
+    involved an SplFileObject). (Nikita)
+
+- Standard:
+  . Fixed bug #74267 (segfault with streams and invalid data). (cmb)
+  . Fixed bug #79579 (ZTS build of PHP 7.3.17 doesn't handle ERANGE for
+    posix_getgrgid and others). (Böszörményi Zoltán)
+
+11 Jun 2020, PHP 7.3.19
+
+- Core:
+  . Fixed bug #79566 (Private SHM is not private on Windows). (cmb)
+  . Fixed bug #79489 (.user.ini does not inherit). (cmb)
+
+- GD:
+  . Fixed bug #79615 (Wrong GIF header written in GD GIFEncode). (sageptr, cmb)
+
+- MySQLnd:
+  . Fixed bug #79596 (MySQL FLOAT truncates to int some locales). (cmb)
+
+- Opcache:
+  . Fixed bug #79535 (PHP crashes with specific opcache.optimization_level).
+    (Nikita)
+  . Fixed bug #79588 (Boolean opcache settings ignore on/off values). (cmb)
+
+- Standard:
+  . Fixed bug #79561 (dns_get_record() fails with DNS_ALL). (cmb)
+
+14 May 2020, PHP 7.3.18
+
+- Core:
+  . Fixed bug #78875 (Long filenames cause OOM and temp files are not cleaned). 
+    (CVE-2019-11048) (cmb)
+  . Fixed bug #78876 (Long variables in multipart/form-data cause OOM and temp 
+    files are not cleaned). (CVE-2019-11048) (cmb)
+  . Fixed bug #79434 (PHP 7.3 and PHP-7.4 crash with NULL-pointer dereference
+    on !CS constant). (Nikita)
+  . Fixed bug #79477 (casting object into array creates references). (Nikita)
+  . Fixed bug #79470 (PHP incompatible with 3rd party file system on demand).
+    (cmb)
+  . Fixed bug #78784 (Unable to interact with files inside a VFS for Git
+    repository). (cmb)
+
+- DOM:
+  . Fixed bug #78221 (DOMNode::normalize() doesn't remove empty text nodes).
+    (cmb)
+
+- FCGI:
+  . Fixed bug #79491 (Search for .user.ini extends up to root dir). (cmb)
+
+- MBString:
+  . Fixed bug #79441 (Segfault in mb_chr() if internal encoding is unsupported).
+    (Girgias)
+
+- OpenSSL:
+  . Fixed bug #79497 (stream_socket_client() throws an unknown error sometimes
+    with <1s timeout). (Joe Cai)
+
+- Phar:
+  . Fix bug #79503 (Memory leak on duplicate metadata). (cmb)
+
+- SimpleXML:
+  . Fixed bug #79528 (Different object of the same xml between 7.4.5 and
+    7.4.4). (cmb)
+
+- Standard:
+  . Fixed bug #79468 (SIGSEGV when closing stream handle with a stream filter
+    appended). (dinosaur)
+
+16 Apr 2020, PHP 7.3.17
+
+- Core:
+  . Fixed bug #79364 (When copy empty array, next key is unspecified). (cmb)
+  . Fixed bug #78210 (Invalid pointer address). (cmb, Nikita)
+
+- CURL:
+  . Fixed bug #79199 (curl_copy_handle() memory leak). (cmb)
+
+- Date:
+  . Fixed bug #79396 (DateTime hour incorrect during DST jump forward). (Nate
+    Brunette)
+
+- Iconv:
+  . Fixed bug #79200 (Some iconv functions cut Windows-1258). (cmb)
+
+- OPcache:
+  . Fixed bug #79412 (Opcache chokes and uses 100% CPU on specific script).
+    (Dmitry)
+
+- Session:
+  . Fixed bug #79413 (session_create_id() fails for active sessions). (cmb)
+
+- Shmop:
+  . Fixed bug #79427 (Integer Overflow in shmop_open()). (cmb)
+
+- SimpleXML:
+  . Fixed bug #61597 (SXE properties may lack attributes and content). (cmb)
+
+- Spl:
+  . Fixed bug #75673 (SplStack::unserialize() behavior). (cmb)
+  . Fixed bug #79393 (Null coalescing operator failing with SplFixedArray).
+    (cmb)
+
+- Standard:
+  . Fixed bug #79330 (shell_exec() silently truncates after a null byte). (stas)
+  . Fixed bug #79465 (OOB Read in urldecode()). (CVE-2020-7067) (stas)
+  . Fixed bug #79410 (system() swallows last chunk if it is exactly 4095 bytes
+    without newline). (Christian Schneider)
+
+- Zip:
+  . Fixed Bug #79296 (ZipArchive::open fails on empty file). (Remi)
+  . Fixed bug #79424 (php_zip_glob uses gl_pathc after call to globfree).
+    (Max Rees)
+
+19 Mar 2020, PHP 7.3.16
+
+- Core:
+  . Fixed bug #63206 (restore_error_handler does not restore previous errors
+    mask). (Mark Plomer)
+
+- COM:
+  . Fixed bug #66322 (COMPersistHelper::SaveToFile can save to wrong location).
+    (cmb)
+  . Fixed bug #79242 (COM error constants don't match com_exception codes on
+    x86). (cmb)
+  . Fixed bug #79248 (Traversing empty VT_ARRAY throws com_exception). (cmb)
+  . Fixed bug #79299 (com_print_typeinfo prints duplicate variables). (Litiano
+    Moura)
+  . Fixed bug #79332 (php_istreams are never freed). (cmb)
+  . Fixed bug #79333 (com_print_typeinfo() leaks memory). (cmb)
+
+- DOM:
+  . Fixed bug #77569: (Write Access Violation in DomImplementation). (Nikita,
+    cmb)
+  . Fixed bug #79271 (DOMDocumentType::$childNodes is NULL). (cmb)
+
+- Enchant:
+  . Fixed bug #79311 (enchant_dict_suggest() fails on big endian architecture).
+    (cmb)
+
+- EXIF:
+  . Fixed bug #79282 (Use-of-uninitialized-value in exif). (CVE-2020-7064)
+    (Nikita)
+
+- MBstring:
+  . Fixed bug #79371 (mb_strtolower (UTF-32LE): stack-buffer-overflow at 
+    php_unicode_tolower_full). (CVE-2020-7065) (cmb)
+
+- MySQLi:
+  . Fixed bug #64032 (mysqli reports different client_version). (cmb)
+
+- PCRE:
+  . Fixed bug #79188 (Memory corruption in preg_replace/preg_replace_callback
+    and unicode). (Nikita)
+
+- PDO_ODBC:
+  . Fixed bug #79038 (PDOStatement::nextRowset() leaks column values). (cmb)
+
+- Reflection:
+  . Fixed bug #79062 (Property with heredoc default value returns false for
+    getDocComment). (Nikita)
+
+- SQLite3:
+  . Fixed bug #79294 (::columnType() may fail after SQLite3Stmt::reset()). (cmb)
+
+- Standard:
+  . Fixed bug #79329 (get_headers() silently truncates after a null byte). 
+    (CVE-2020-7066) (cmb)
+  . Fixed bug #79254 (getenv() w/o arguments not showing changes). (cmb)
+  . Fixed bug #79265 (Improper injection of Host header when using fopen for
+    http requests). (Miguel Xavier Penha Neto)
+
+20 Feb 2020, PHP 7.3.15
+
+- Core:
+  . Fixed bug #71876 (Memory corruption htmlspecialchars(): charset `*' not
+    supported). (Nikita)
+  . Fixed bug #79146 (cscript can fail to run on some systems). (clarodeus)
+  . Fixed bug #78323 (Code 0 is returned on invalid options). (Ivan Mikheykin)
+  . Fixed bug #76047 (Use-after-free when accessing already destructed
+    backtrace arguments). (Nikita)
+
+- CURL:
+  . Fixed bug #79078 (Hypothetical use-after-free in curl_multi_add_handle()).
+    (cmb)
+
+- Intl:
+  . Fixed bug #79212 (NumberFormatter::format() may detect wrong type). (cmb)
+
+- Libxml:
+  . Fixed bug #79191 (Error in SoapClient ctor disables DOMDocument::save()).
+    (Nikita, cmb)
+
+- MBString:
+  . Fixed bug #79154 (mb_convert_encoding() can modify $from_encoding). (cmb)
+
+- MySQLnd:
+  . Fixed bug #79084 (mysqlnd may fetch wrong column indexes with MYSQLI_BOTH).
+    (cmb)
+
+- OpenSSL:
+  . Fixed bug #79145 (openssl memory leak). (cmb, Nikita)
+
+- Phar:
+  . Fixed bug #79082 (Files added to tar with Phar::buildFromIterator have
+    all-access permissions). (CVE-2020-7063) (stas)
+  . Fixed bug #79171 (heap-buffer-overflow in phar_extract_file).
+    (CVE-2020-7061) (cmb)
+  . Fixed bug #76584 (PharFileInfo::decompress not working). (cmb)
+
+- Reflection:
+  . Fixed bug #79115 (ReflectionClass::isCloneable call reflected class
+    __destruct). (Nikita)
+
+- Session:
+  . Fixed bug #79221 (Null Pointer Dereference in PHP Session Upload Progress).
+    (CVE-2020-7062) (stas)
+
+- SPL:
+  . Fixed bug #79151 (heap use after free caused by
+    spl_dllist_it_helper_move_forward). (Nikita)
+
+- Standard:
+  . Fixed bug #78902 (Memory leak when using stream_filter_append). (liudaixiao)
+
+- Testing:
+  . Fixed bug #78090 (bug45161.phpt takes forever to finish). (cmb)
+
+- XSL:
+  . Fixed bug #70078 (XSL callbacks with nodes as parameter leak memory). (cmb)
+
+23 Jan 2020, PHP 7.3.14
+
+- Core
+  . Fixed bug #78999 (Cycle leak when using function result as temporary).
+    (Dmitry)
+
+- CURL:
+  . Fixed bug #79033 (Curl timeout error with specific url and post). (cmb)
+
+- Date:
+  . Fixed bug #79015 (undefined-behavior in php_date.c). (cmb)
+
+- DBA:
+  . Fixed bug #78808 ([LMDB] MDB_MAP_FULL: Environment mapsize limit reached).
+    (cmb)
+
+- Fileinfo:
+  . Fixed bug #74170 (locale information change after mime_content_type).
+    (Sergei Turchanov)
+
+- GD:
+  . Fixed bug #78923 (Artifacts when convoluting image with transparency).
+    (wilson chen)
+  . Fixed bug #79067 (gdTransformAffineCopy() may use unitialized values). (cmb)
+  . Fixed bug #79068 (gdTransformAffineCopy() changes interpolation method).
+    (cmb)
+
+- Libxml:
+  . Fixed bug #79029 (Use After Free's in XMLReader / XMLWriter). (Laruence)
+
+- Mbstring:
+  . Fixed bug #79037 (global buffer-overflow in `mbfl_filt_conv_big5_wchar`). 
+    (CVE-2020-7060) (Nikita)
+
+- OPcache:
+  . Fixed bug #79040 (Warning Opcode handlers are unusable due to ASLR). (cmb)
+
+- Pcntl:
+  . Fixed bug #78402 (Converting null to string in error message is bad DX).
+    (SATŌ Kentarō)
+
+- PDO_PgSQL:
+  . Fixed bug #78983 (pdo_pgsql config.w32 cannot find libpq-fe.h). (SATŌ
+    Kentarō)
+  . Fixed bug #78980 (pgsqlGetNotify() overlooks dead connection). (SATŌ
+    Kentarō)
+  . Fixed bug #78982 (pdo_pgsql returns dead persistent connection). (SATŌ
+    Kentarō)
+
+- Session:
+  . Fixed bug #79091 (heap use-after-free in session_create_id()). (cmb, Nikita)
+
+- Shmop:
+  . Fixed bug #78538 (shmop memory leak). (cmb)
+
+- Standard:
+  . Fixed bug #79099 (OOB read in php_strip_tags_ex). (CVE-2020-7059). (cmb)
+  . Fixed bug #54298 (Using empty additional_headers adding extraneous CRLF).
+    (cmb)
+
+18 Dec 2019, PHP 7.3.13
+
+- Bcmath:
+  . Fixed bug #78878 (Buffer underflow in bc_shift_addsub). (CVE-2019-11046).
+    (cmb)
+
+- Core:
+  . Fixed bug #78862 (link() silently truncates after a null byte on Windows).
+    (CVE-2019-11044). (cmb)
+  . Fixed bug #78863 (DirectoryIterator class silently truncates after a null
+    byte). (CVE-2019-11045). (cmb)
+  . Fixed bug #78943 (mail() may release string with refcount==1 twice).
+    (CVE-2019-11049). (cmb)
+  . Fixed bug #78787 (Segfault with trait overriding inherited private shadow
+    property). (Nikita)
+  . Fixed bug #78868 (Calling __autoload() with incorrect EG(fake_scope) value).
+    (Antony Dovgal, Dmitry)
+  . Fixed bug #78296 (is_file fails to detect file). (cmb)
+
+- EXIF:
+  . Fixed bug #78793 (Use-after-free in exif parsing under memory sanitizer).
+    (CVE-2019-11050). (Nikita)
+  . Fixed bug #78910 (Heap-buffer-overflow READ in exif). (CVE-2019-11047).
+    (Nikita)
+
+- GD:
+  . Fixed bug #78849 (GD build broken with -D SIGNED_COMPARE_SLOW). (cmb)
+
+- MBString:
+  . Upgraded bundled Oniguruma to 6.9.4. (cmb)
+
+- OPcache:
+  . Fixed potential ASLR related invalid opline handler issues. (cmb)
+  . Fixed $x = (bool)$x; with opcache (should emit undeclared variable notice).
+    (Tyson Andre)
+
+- PCRE:
+  . Fixed bug #78853 (preg_match() may return integer > 1). (cmb)
+
+- Standard:
+  . Fixed bug #78759 (array_search in $GLOBALS). (Nikita)
+  . Fixed bug #77638 (var_export'ing certain class instances segfaults). (cmb)
+  . Fixed bug #78840 (imploding $GLOBALS crashes). (cmb)
+  . Fixed bug #78833 (Integer overflow in pack causes out-of-bound access).
+    (cmb)
+  . Fixed bug #78814 (strip_tags allows / in tag name => whitelist bypass).
+    (cmb)
+
+21 Nov 2019, PHP 7.3.12
+
+- Core:
+  . Fixed bug #78658 (Memory corruption using Closure::bindTo). (Nikita)
+  . Fixed bug #78656 (Parse errors classified as highest log-level). (Erik
+    Lundin)
+  . Fixed bug #78752 (Segfault if GC triggered while generator stack frame is
+    being destroyed). (Nikita)
+  . Fixed bug #78689 (Closure::fromCallable() doesn't handle
+    [Closure, '__invoke']). (Nikita)
+
+- COM:
+  . Fixed bug #78694 (Appending to a variant array causes segfault). (cmb)
+
+- Date:
+  . Fixed bug #70153 (\DateInterval incorrectly unserialized). (Maksim Iakunin)
+  . Fixed bug #78751 (Serialising DatePeriod converts DateTimeImmutable). (cmb)
+
+- Iconv:
+  . Fixed bug #78642 (Wrong libiconv version displayed). (gedas at martynas,
+    cmb).
+
+- OpCache:
+  . Fixed bug #78654 (Incorrectly computed opcache checksum on files with 
+    non-ascii characters). (mhagstrand)
+  . Fixed bug #78747 (OpCache corrupts custom extension result). (Nikita)
+
+- OpenSSL:
+  . Fixed bug #78775 (TLS issues from HTTP request affecting other encrypted
+    connections). (Nikita)
+
+- Reflection:
+  . Fixed bug #78697 (ReflectionClass::ImplementsInterface - inaccurate error 
+    message with traits). (villfa)
+
+- Sockets:
+  . Fixed bug #78665 (Multicasting may leak memory). (cmb)
+
+24 Oct 2019, PHP 7.3.11
+
+- Core:
+  . Fixed bug #78535 (auto_detect_line_endings value not parsed as bool).
+    (bugreportuser)
+  . Fixed bug #78620 (Out of memory error). (cmb, Nikita)
+
+- Exif :
+  . Fixed bug #78442 ('Illegal component' on exif_read_data since PHP7)
+	(Kalle)
+
+- FPM:
+  . Fixed bug #78599 (env_path_info underflow in fpm_main.c can lead to RCE).
+    (CVE-2019-11043) (Jakub Zelenka)
+  . Fixed bug #78413 (request_terminate_timeout does not take effect after
+    fastcgi_finish_request). (Sergei Turchanov)
+
+- MBString:
+  . Fixed bug #78633 (Heap buffer overflow (read) in mb_eregi). (cmb)
+  . Fixed bug #78579 (mb_decode_numericentity: args number inconsistency).
+    (cmb)
+  . Fixed bug #78609 (mb_check_encoding() no longer supports stringable
+    objects). (cmb)
+
+- MySQLi:
+  . Fixed bug #76809 (SSL settings aren't respected when persistent connections 
+    are used). (fabiomsouto)
+
+- Mysqlnd:
+  . Fixed bug #78525 (Memory leak in pdo when reusing native prepared
+    statements). (Nikita)
+
+- PCRE:
+  . Fixed bug #78272 (calling preg_match() before pcntl_fork() will freeze
+    child process). (Nikita)
+
+- PDO_MySQL:
+  . Fixed bug #78623 (Regression caused by "SP call yields additional empty
+    result set"). (cmb)
+
+- Session:
+  . Fixed bug #78624 (session_gc return value for user defined session 
+    handlers). (bshaffer)
+
+- Standard:
+  . Fixed bug #76342 (file_get_contents waits twice specified timeout).
+    (Thomas Calvet)
+  . Fixed bug #78612 (strtr leaks memory when integer keys are used and the
+    subject string shorter). (Nikita)
+  . Fixed bug #76859 (stream_get_line skips data if used with data-generating 
+    filter). (kkopachev)
+
+- Zip:
+  . Fixed bug #78641 (addGlob can modify given remove_path value). (cmb)
+
+26 Sep 2019, PHP 7.3.10
+
+- Core:
+  . Fixed bug #78220 (Can't access OneDrive folder). (cmb, ab)
+  . Fixed bug #77922 (Double release of doc comment on inherited shadow
+    property). (Nikita)
+  . Fixed bug #78441 (Parse error due to heredoc identifier followed by digit).
+    (cmb)
+  . Fixed bug #77812 (Interactive mode does not support PHP 7.3-style heredoc).
+    (cmb, Nikita)
+
+- FastCGI:
+  . Fixed bug #78469 (FastCGI on_accept hook is not called when using named
+    pipes on Windows). (Sergei Turchanov)
+
+- FPM:
+  . Fixed bug #78334 (fpm log prefix message includes wrong stdout/stderr
+    notation). (Tsuyoshi Sadakata)
+
+- Intl:
+  . Ensure IDNA2003 rules are used with idn_to_ascii() and idn_to_utf8()
+    when requested. (Sara)
+
+- MBString:
+  . Fixed bug #78559 (Heap buffer overflow in mb_eregi). (cmb)
+
+- MySQLnd:
+  . Fixed connect_attr issues and added the _server_host connection attribute.
+    (Qianqian Bu)
+
+- ODBC:
+  . Fixed bug #78473 (odbc_close() closes arbitrary resources). (cmb)
+
+- PDO_MySQL:
+  . Fixed bug #41997 (SP call yields additional empty result set). (cmb)
+
+- sodium:
+  . Fixed bug #78510 (Partially uninitialized buffer returned by
+    sodium_crypto_generichash_init()). (Frank Denis, cmb)
+
+29 Aug 2019, PHP 7.3.9
+
+- Core:
+  . Fixed bug #78363 (Buffer overflow in zendparse). (Nikita)
+  . Fixed bug #78379 (Cast to object confuses GC, causes crash). (Dmitry)
+  . Fixed bug #78412 (Generator incorrectly reports non-releasable $this as GC
+    child). (Nikita)
+
+- Curl:
+  . Fixed bug #77946 (Bad cURL resources returned by curl_multi_info_read()).
+    (Abyr Valg)
+
+- Exif:
+  . Fixed bug #78333 (Exif crash (bus error) due to wrong alignment and
+    invalid cast). (Nikita)
+
+- FPM:
+  . Fixed bug #77185 (Use-after-free in FPM master event handling).
+    (Maksim Nikulin)
+
+- Iconv:
+  . Fixed bug #78342 (Bus error in configure test for iconv //IGNORE). (Rainer
+    Jung)
+
+- LiteSpeed:
+  . Updated to LiteSpeed SAPI V7.5 (Fixed clean shutdown). (George Wang)
+
+- MBString:
+  . Fixed bug #78380 (Oniguruma 6.9.3 fixes CVEs). (CVE-2019-13224) (Stas)
+
+- MySQLnd:
+  . Fixed bug #78179 (MariaDB server version incorrectly detected). (cmb)
+  . Fixed bug #78213 (Empty row pocket). (cmb)
+
+- Opcache:
+  . Fixed bug #77191 (Assertion failure in dce_live_ranges() when silencing is
+    used). (Nikita)
+
+- Standard:
+  . Fixed bug #69100 (Bus error from stream_copy_to_stream (file -> SSL stream)
+    with invalid length). (Nikita)
+  . Fixed bug #78282 (atime and mtime mismatch). (cmb)
+  . Fixed bug #78326 (improper memory deallocation on stream_get_contents()
+    with fixed length buffer). (Albert Casademont)
+  . Fixed bug #78346 (strip_tags no longer handling nested php tags). (cmb)
+
+01 Aug 2019, PHP 7.3.8
+
+- Core:
+  . Added syslog.filter=raw option. (Erik Lundin)
+  . Fixed bug #78212 (Segfault in built-in webserver). (cmb)
+
+- Date:
+  . Fixed bug #69044 (discrepency between time and microtime). (krakjoe)
+  . Updated timelib to 2018.02. (Derick)
+
+- EXIF:
+  . Fixed bug #78256 (heap-buffer-overflow on exif_process_user_comment).
+    (CVE-2019-11042) (Stas)
+  . Fixed bug #78222 (heap-buffer-overflow on exif_scan_thumbnail).
+    (CVE-2019-11041) (Stas)
+
+- FTP:
+  . Fixed bug #78039 (FTP with SSL memory leak). (Nikita)
+
+- Libxml:
+  . Fixed bug #78279 (libxml_disable_entity_loader settings is shared between
+    requests (cgi-fcgi)). (Nikita)
+
+- LiteSpeed:
+  . Updated to LiteSpeed SAPI V7.4.3 (increased response header count limit from
+    100 to 1000, added crash handler to cleanly shutdown PHP request, added
+    CloudLinux mod_lsapi mode). (George Wang)
+  . Fixed bug #76058 (After "POST data can't be buffered", using php://input
+    makes huge tmp files). (George Wang)
+
+- Openssl:
+  . Fixed bug #78231 (Segmentation fault upon stream_socket_accept of exported
+    socket-to-stream). (Nikita)
+
+- Opcache:
+  . Fixed bug #78189 (file cache strips last character of uname hash). (cmb)
+  . Fixed bug #78202 (Opcache stats for cache hits are capped at 32bit NUM).
+    (cmb)
+  . Fixed bug #78271 (Invalid result of if-else). (Nikita)
+  . Fixed bug #78291 (opcache_get_configuration doesn't list all directives).
+    (Andrew Collington)
+  . Fixed bug #78341 (Failure to detect smart branch in DFA pass). (Nikita)
+
+- PCRE:
+  . Fixed bug #78197 (PCRE2 version check in configure fails for "##.##-xxx"
+    version strings). (pgnet, Peter Kokot)
+  . Fixed bug #78338 (Array cross-border reading in PCRE). (cmb)
+
+- PDO_Sqlite:
+  . Fixed bug #78192 (SegFault when reuse statement after schema has changed).
+    (Vincent Quatrevieux)
+
+- Phar:
+  . Fixed bug #77919 (Potential UAF in Phar RSHUTDOWN). (cmb)
+
+- Phpdbg:
+  . Fixed bug #78297 (Include unexistent file memory leak). (Nikita)
+
+- SQLite:
+  . Upgraded to SQLite 3.28.0. (cmb)
+
+- Standard:
+  . Fixed bug #78241 (touch() does not handle dates after 2038 in PHP 64-bit). (cmb)
+  . Fixed bug #78269 (password_hash uses weak options for argon2). (Remi)
+
+04 Jul 2019, PHP 7.3.7
+
+- Core:
+  . Fixed bug #76980 (Interface gets skipped if autoloader throws an exception).
+    (Nikita)
+
+- DOM:
+  . Fixed bug #78025 (segfault when accessing properties of DOMDocumentType).
+    (cmb)
+
+- MySQLi:
+  . Fixed bug #77956 (When mysqli.allow_local_infile = Off, use a meaningful
+    error message). (Sjon Hortensius)
+  . Fixed bug #38546 (bindParam incorrect processing of bool types).
+    (camporter)
+
+- MySQLnd:
+  . Fixed bug #77955 (Random segmentation fault in mysqlnd from php-fpm).
+    (Nikita)
+
+- Opcache:
+  . Fixed bug #78015 (Incorrect evaluation of expressions involving partials
+    arrays in SCCP). (Nikita)
+  . Fixed bug #78106 (Path resolution fails if opcache disabled during request).
+    (Nikita)
+
+- OpenSSL:
+  . Fixed bug #78079 (openssl_encrypt_ccm.phpt fails with OpenSSL 1.1.1c).
+    (Jakub Zelenka)
+
+- phpdbg:
+  . Fixed bug #78050 (SegFault phpdbg + opcache on include file twice).
+    (Nikita)
+
+- Sockets:
+  . Fixed bug #78038 (Socket_select fails when resource array contains
+    references). (Nikita)
+
+- Sodium:
+  . Fixed bug #78114 (segfault when calling sodium_* functions from eval). (cmb)
+
+- Standard:
+  . Fixed bug #77135 (Extract with EXTR_SKIP should skip $this).
+    (Craig Duncan, Dmitry)
+  . Fixed bug #77937 (preg_match failed). (cmb, Anatol)
+
+- Zip:
+  . Fixed bug #76345 (zip.h not found). (Michael Maroszek)
+
+30 May 2019, PHP 7.3.6
+
+- cURL:
+  . Implemented FR #72189 (Add missing CURL_VERSION_* constants). (Javier
+    Spagnoletti)
+
+- Date:
+  . Fixed bug #77909 (DatePeriod::__construct() with invalid recurrence count
+    value). (Ignace Nyamagana Butera)
+
+- EXIF:
+  . Fixed bug #77988 (heap-buffer-overflow on php_jpg_get16).
+    (CVE-2019-11040) (Stas)
+
+- FPM:
+  . Fixed bug #77934 (php-fpm kill -USR2 not working). (Jakub Zelenka)
+  . Fixed bug #77921 (static.php.net doesn't work anymore). (Peter Kokot)
+
+- GD:
+  . Fixed bug #77943 (imageantialias($image, false); does not work). (cmb)
+  . Fixed bug #77973 (Uninitialized read in gdImageCreateFromXbm).
+    (CVE-2019-11038) (cmb)
+
+- Iconv:
+  . Fixed bug #78069 (Out-of-bounds read in iconv.c:_php_iconv_mime_decode()
+    due to integer overflow). (CVE-2019-11039). (maris dot adam)
+
+- JSON:
+  . Fixed bug #77843 (Use after free with json serializer). (Nikita)
+
+- Opcache:
+  . Fixed possible crashes, because of inconsistent PCRE cache and opcache
+    SHM reset. (Alexey Kalinin, Dmitry)
+
+- PDO_MySQL:
+  . Fixed bug #77944 (Wrong meta pdo_type for bigint on LLP64). (cmb)
+
+- Reflection:
+  . Fixed bug #75186 (Inconsistent reflection of Closure:::__invoke()). (Nikita)
+
+- Session:
+  . Fixed bug #77911 (Wrong warning for session.sid_bits_per_character). (cmb)
+
+- SOAP:
+  . Fixed bug #77945 (Segmentation fault when constructing SoapClient with
+    WSDL_CACHE_BOTH). (Nikita)
+
+- SPL:
+  . Fixed bug #77024 (SplFileObject::__toString() may return array). (Craig
+    Duncan)
+
+- SQLite:
+  . Fixed bug #77967 (Bypassing open_basedir restrictions via file uris). (Stas)
+
+- Standard:
+  . Fixed bug #77931 (Warning for array_map mentions wrong type). (Nikita)
+  . Fixed bug #78003 (strip_tags output change since PHP 7.3). (cmb)
+
+02 May 2019, PHP 7.3.5
+
+- Core:
+  . Fixed bug #77903 (ArrayIterator stops iterating after offsetSet call).
+    (Nikita)
+
+- CLI:
+  . Fixed bug #77794 (Incorrect Date header format in built-in server).
+    (kelunik)
+
+- EXIF
+  . Fixed bug #77950 (Heap-buffer-overflow in _estrndup via exif_process_IFD_TAG).
+    (CVE-2019-11036) (Stas)
+
+- Interbase:
+  . Fixed bug #72175 (Impossibility of creating multiple connections to
+    Interbase with php 7.x). (Nikita)
+
+- Intl:
+  . Fixed bug #77895 (IntlDateFormatter::create fails in strict mode if $locale
+    = null). (Nikita)
+
+- LDAP:
+  . Fixed bug #77869 (Core dump when using server controls) (mcmic)
+
+- Mail
+  . Fixed bug #77821 (Potential heap corruption in TSendMail()). (cmb)
+
+- mbstring:
+  . Implemented FR #72777 (Implement regex stack limits for mbregex functions).
+    (Yasuo Ohgaki, Stas)
+
+- MySQLi:
+  . Fixed bug #77773 (Unbuffered queries leak memory - MySQLi / mysqlnd).
+    (Nikita)
+
+- PCRE:
+  . Fixed bug #77827 (preg_match does not ignore \r in regex flags). (requinix,
+    cmb)
+
+- PDO:
+  . Fixed bug #77849 (Disable cloning of PDO handle/connection objects).
+    (camporter)
+
+- phpdbg:
+  . Fixed bug #76801 (too many open files). (alekitto)
+  . Fixed bug #77800 (phpdbg segfaults on listing some conditional breakpoints).
+    (krakjoe)
+  . Fixed bug #77805 (phpdbg build fails when readline is shared). (krakjoe)
+
+- Reflection:
+  . Fixed bug #77772 (ReflectionClass::getMethods(null) doesn't work). (Nikita)
+  . Fixed bug #77882 (Different behavior: always calls destructor). (Nikita)
+
+- Standard:
+  . Fixed bug #77793 (Segmentation fault in extract() when overwriting
+    reference with itself). (Nikita)
+  . Fixed bug #77844 (Crash due to null pointer in parse_ini_string with
+    INI_SCANNER_TYPED). (Nikita)
+  . Fixed bug #77853 (Inconsistent substr_compare behaviour with empty
+    haystack). (Nikita)
+
+04 Apr 2019, PHP 7.3.4
+
+- Core:
+  . Fixed bug #77738 (Nullptr deref in zend_compile_expr). (Laruence)
+  . Fixed bug #77660 (Segmentation fault on break 2147483648). (Laruence)
+  . Fixed bug #77652 (Anonymous classes can lose their interface information).
+    (Nikita)
+  . Fixed bug #77345 (Stack Overflow caused by circular reference in garbage
+    collection). (Alexandru Patranescu, Nikita, Dmitry)
+  . Fixed bug #76956 (Wrong value for 'syslog.filter' documented in php.ini).
+    (cmb)
+
+- Apache2Handler:
+  . Fixed bug #77648 (BOM in sapi/apache2handler/php_functions.c). (cmb)
+
+- Bcmath:
+  . Fixed bug #77742 (bcpow() implementation related to gcc compiler
+    optimization). (Nikita)
+
+- CLI Server:
+  . Fixed bug #77722 (Incorrect IP set to $_SERVER['REMOTE_ADDR'] on the
+    localhost). (Nikita)
+
+- COM:
+  . Fixed bug #77578 (Crash when php unload). (cmb)
+
+- EXIF:
+  . Fixed bug #77753 (Heap-buffer-overflow in php_ifd_get32s). (CVE-2019-11034)
+    (Stas)
+  . Fixed bug #77831 (Heap-buffer-overflow in exif_iif_add_value).
+    (CVE-2019-11035) (Stas)
+
+- FPM:
+  . Fixed bug #77677 (FPM fails to build on AIX due to missing WCOREDUMP).
+    (Kevin Adler)
+
+- GD:
+  . Fixed bug #77700 (Writing truecolor images as GIF ignores interlace flag).
+    (cmb)
+
+- MySQLi:
+  . Fixed bug #77597 (mysqli_fetch_field hangs scripts). (Nikita)
+
+- Opcache:
+  . Fixed bug #77743 (Incorrect pi node insertion for jmpznz with identical
+    successors). (Nikita)
+
+- PCRE:
+  . Fixed bug #76127 (preg_split does not raise an error on invalid UTF-8).
+    (Nikita)
+
+- Phar:
+  . Fixed bug #77697 (Crash on Big_Endian platform). (Laruence)
+
+- phpdbg:
+  . Fixed bug #77767 (phpdbg break cmd aliases listed in help do not match
+    actual aliases). (Miriam Lauter)
+
+- sodium:
+  . Fixed bug #77646 (sign_detached() strings not terminated). (Frank)
+
+- SQLite3:
+  . Added sqlite3.defensive INI directive. (BohwaZ)
+
+- Standard:
+  . Fixed bug #77664 (Segmentation fault when using undefined constant in
+    custom wrapper). (Laruence)
+  . Fixed bug #77669 (Crash in extract() when overwriting extracted array).
+    (Nikita)
+  . Fixed bug #76717 (var_export() does not create a parsable value for
+    PHP_INT_MIN). (Nikita)
+  . Fixed bug #77765 (FTP stream wrapper should set the directory as
+    executable). (Vlad Temian)
+
+07 Mar 2019, PHP 7.3.3
+
+- Core:
+  . Fixed bug #77589 (Core dump using parse_ini_string with numeric sections).
+    (Laruence)
+  . Fixed bug #77329 (Buffer Overflow via overly long Error Messages).
+    (Dmitry)
+  . Fixed bug #77494 (Disabling class causes segfault on member access).
+    (Dmitry)
+  . Fixed bug #77498 (Custom extension Segmentation fault when declare static
+    property). (Nikita)
+  . Fixed bug #77530 (PHP crashes when parsing `(2)::class`). (Ekin)
+  . Fixed bug #77546 (iptcembed broken function). (gdegoulet)
+  . Fixed bug #77630 (rename() across the device may allow unwanted access
+    during processing). (Stas)
+
+- COM:
+  . Fixed bug #77621 (Already defined constants are not properly reported).
+    (cmb)
+  . Fixed bug #77626 (Persistence confusion in php_com_import_typelib()). (cmb)
+
+- EXIF:
+  . Fixed bug #77509 (Uninitialized read in exif_process_IFD_in_TIFF). (Stas)
+  . Fixed bug #77540 (Invalid Read on exif_process_SOFn). (Stas)
+  . Fixed bug #77563 (Uninitialized read in exif_process_IFD_in_MAKERNOTE). (Stas)
+  . Fixed bug #77659 (Uninitialized read in exif_process_IFD_in_MAKERNOTE). (Stas)
+
+- Mbstring:
+  . Fixed bug #77514 (mb_ereg_replace() with trailing backslash adds null byte).
+    (Nikita)
+
+- MySQL
+  . Disabled LOCAL INFILE by default, can be enabled using php.ini directive
+    mysqli.allow_local_infile for mysqli, or PDO::MYSQL_ATTR_LOCAL_INFILE
+    attribute for pdo_mysql. (Darek Slusarczyk)
+
+- OpenSSL:
+  . Fixed bug #77390 (feof might hang on TLS streams in case of fragmented TLS
+    records). (Abyl Valg, Jakub Zelenka)
+
+- PDO_OCI:
+  . Support Oracle Database tracing attributes ACTION, MODULE,
+    CLIENT_INFO, and CLIENT_IDENTIFIER. (Cameron Porter)
+
+- PHAR:
+  . Fixed bug #77396 (Null Pointer Dereference in phar_create_or_parse_filename).
+    (bishop)
+  . Fixed bug #77586 (phar_tar_writeheaders_int() buffer overflow). (bishop)
+
+- phpdbg:
+  . Fixed bug #76596 (phpdbg support for display_errors=stderr). (kabel)
+
+- SPL:
+  . Fixed bug #51068 (DirectoryIterator glob:// don't support current path
+    relative queries). (Ahmed Abdou)
+  . Fixed bug #77431 (openFile() silently truncates after a null byte). (cmb)
+
+- Standard:
+  . Fixed bug #77552 (Unintialized php_stream_statbuf in stat functions).
+    (John Stevenson)
+  . Fixed bug #77612 (setcookie() sets incorrect SameSite header if all of its
+    options filled). (Nikita)
+
+07 Feb 2019, PHP 7.3.2
+
+- Core:
+  . Fixed bug #77369 (memcpy with negative length via crafted DNS response). (Stas)
+  . Fixed bug #77387 (Recursion detection broken when printing GLOBALS).
+    (Laruence)
+  . Fixed bug #77376 ("undefined function" message no longer includes
+    namespace). (Laruence)
+  . Fixed bug #77357 (base64_encode / base64_decode doest not work on nested
+    VM). (Nikita)
+  . Fixed bug #77339 (__callStatic may get incorrect arguments). (Dmitry)
+  . Fixed bug #77317 (__DIR__, __FILE__, realpath() reveal physical path for
+    subst virtual drive). (Anatol)
+  . Fixed bug #77263 (Segfault when using 2 RecursiveFilterIterator). (Dmitry)
+  . Fixed bug #77447 (PHP 7.3 built with ASAN crashes in
+    zend_cpu_supports_avx2). (Nikita)
+  . Fixed bug #77484 (Zend engine crashes when calling realpath in invalid
+    working dir). (Anatol)
+
+- Curl:
+  . Fixed bug #76675 (Segfault with H2 server push). (Pedro Magalhães)
+
+- Fileinfo:
+  . Fixed bug #77346 (webm files incorrectly detected as
+    application/octet-stream). (Anatol)
+
+- FPM:
+  . Fixed bug #77430 (php-fpm crashes with Main process exited, code=dumped,
+    status=11/SEGV). (Jakub Zelenka)
+
+- GD:
+  . Fixed bug #73281 (imagescale(…, IMG_BILINEAR_FIXED) can cause black border).
+    (cmb)
+  . Fixed bug #73614 (gdImageFilledArc() doesn't properly draw pies). (cmb)
+  . Fixed bug #77272 (imagescale() may return image resource on failure). (cmb)
+  . Fixed bug #77391 (1bpp BMPs may fail to be loaded). (Romain Déoux, cmb)
+  . Fixed bug #77479 (imagewbmp() segfaults with very large images). (cmb)
+
+- ldap:
+  . Fixed bug #77440 (ldap_bind using ldaps or ldap_start_tls()=exception in
+    libcrypto-1_1-x64.dll). (Anatol)
+
+- Mbstring:
+  . Fixed bug #77428 (mb_ereg_replace() doesn't replace a substitution
+    variable). (Nikita)
+  . Fixed bug #77454 (mb_scrub() silently truncates after a null byte).
+    (64796c6e69 at gmail dot com)
+
+- MySQLnd:
+  . Fixed bug #77308 (Unbuffered queries memory leak). (Dmitry)
+  . Fixed bug #75684 (In mysqlnd_ext_plugin.h the plugin methods family has
+      no external visibility). (Anatol)
+
+- Opcache:
+  . Fixed bug #77266 (Assertion failed in dce_live_ranges). (Laruence)
+  . Fixed bug #77257 (value of variable assigned in a switch() construct gets
+    lost). (Nikita)
+  . Fixed bug #77434 (php-fpm workers are segfaulting in zend_gc_addre).
+    (Nikita)
+  . Fixed bug #77361 (configure fails on 64-bit AIX when opcache enabled).
+    (Kevin Adler)
+  . Fixed bug #77287 (Opcache literal compaction is incompatible with EXT
+    opcodes). (Nikita)
+
+- PCRE:
+  . Fixed bug #77338 (get_browser with empty string). (Nikita)
+
+- PDO:
+  . Fixed bug #77273 (array_walk_recursive corrupts value types leading to PDO
+    failure). (Nikita)
+
+- PDO MySQL:
+  . Fixed bug #77289 (PDO MySQL segfaults with persistent connection).
+    (Lauri Kenttä)
+
+- SOAP:
+  . Fixed bug #77410 (Segmentation Fault when executing method with an empty
+    parameter). (Nikita)
+
+- Sockets:
+  . Fixed bug #76839 (socket_recvfrom may return an invalid 'from' address
+    on MacOS). (Michael Meyer)
+
+- SPL:
+  . Fixed bug #77298 (segfault occurs when add property to unserialized empty
+    ArrayObject). (jhdxr)
+
+- Standard:
+  . Fixed bug #77395 (segfault about array_multisort). (Laruence)
+  . Fixed bug #77439 (parse_str segfaults when inserting item into existing
+    array). (Nikita)
+
+10 Jan 2019, PHP 7.3.1
+
+- Core:
+  . Fixed bug #76654 (Build failure on Mac OS X on 32-bit Intel). (Ryandesign)
+  . Fixed bug #71041 (zend_signal_startup() needs ZEND_API).
+    (Valentin V. Bartenev)
+  . Fixed bug #76046 (PHP generates "FE_FREE" opcode on the wrong line).
+    (Nikita)
+  . Fixed bug #77291 (magic methods inherited from a trait may be ignored).
+    (cmb)
+
+- CURL:
+  . Fixed bug #77264 (curl_getinfo returning microseconds, not seconds).
+    (Pierrick)
+
+- COM:
+  . Fixed bug #77177 (Serializing or unserializing COM objects crashes). (cmb)
+
+- Exif:
+  . Fixed bug #77184 (Unsigned rational numbers are written out as signed
+    rationals). (Colin Basnett)
+
+- GD:
+  . Fixed bug #77195 (Incorrect error handling of imagecreatefromjpeg()). (cmb)
+  . Fixed bug #77198 (auto cropping has insufficient precision). (cmb)
+  . Fixed bug #77200 (imagecropauto(…, GD_CROP_SIDES) crops left but not right).
+    (cmb)
+  . Fixed bug #77269 (efree() on uninitialized Heap data in imagescale leads to
+    use-after-free). (cmb)
+  . Fixed bug #77270 (imagecolormatch Out Of Bounds Write on Heap). (cmb)
+
+- MBString:
+  . Fixed bug #77367 (Negative size parameter in mb_split). (Stas)
+  . Fixed bug #77370 (Buffer overflow on mb regex functions - fetch_token).
+    (Stas)
+  . Fixed bug #77371 (heap buffer overflow in mb regex functions
+    - compile_string_node). (Stas)
+  . Fixed bug #77381 (heap buffer overflow in multibyte match_at). (Stas)
+  . Fixed bug #77382 (heap buffer overflow due to incorrect length in
+    expand_case_fold_string). (Stas)
+  . Fixed bug #77385 (buffer overflow in fetch_token). (Stas)
+  . Fixed bug #77394 (Buffer overflow in multibyte case folding - unicode).
+    (Stas)
+  . Fixed bug #77418 (Heap overflow in utf32be_mbc_to_code). (Stas)
+
+- OCI8:
+  . Fixed bug #76804 (oci_pconnect with OCI_CRED_EXT not working). (KoenigsKind)
+  . Added oci_set_call_timeout() for call timeouts.
+  . Added oci_set_db_operation() for the DBOP end-to-end-tracing attribute.
+
+- Opcache:
+  . Fixed bug #77215 (CFG assertion failure on multiple finalizing switch
+    frees in one block). (Nikita)
+  . Fixed bug #77275 (OPcache optimization problem for ArrayAccess->offsetGet).
+    (Nikita)
+
+- PCRE:
+  . Fixed bug #77193 (Infinite loop in preg_replace_callback). (Anatol)
+
+- PDO:
+  . Handle invalid index passed to PDOStatement::fetchColumn() as error. (Sergei
+    Morozov)
+
+- Phar:
+  . Fixed bug #77247 (heap buffer overflow in phar_detect_phar_fname_ext). (Stas)
+
+- Soap:
+  . Fixed bug #77088 (Segfault when using SoapClient with null options).
+    (Laruence)
+
+- Sockets:
+  . Fixed bug #77136 (Unsupported IPV6_RECVPKTINFO constants on macOS).
+    (Mizunashi Mana)
+
+- Sodium:
+  . Fixed bug #77297 (SodiumException segfaults on PHP 7.3). (Nikita, Scott)
+
+- SPL:
+  . Fixed bug #77359 (spl_autoload causes segfault). (Lauri Kenttä)
+  . Fixed bug #77360 (class_uses causes segfault). (Lauri Kenttä)
+
+- SQLite3:
+  . Fixed bug #77051 (Issue with re-binding on SQLite3). (BohwaZ)
+
+- Xmlrpc:
+  . Fixed bug #77242 (heap out of bounds read in xmlrpc_decode()). (cmb)
+  . Fixed bug #77380 (Global out of bounds read in xmlrpc base64 code). (Stas)
+
+06 Dec 2018, PHP 7.3.0
+
+- Core:
+  . Improved PHP GC. (Dmitry, Nikita)
+  . Redesigned the old ext_skel program written in PHP, run:
+    'php ext_skel.php' for all options. This means there are no dependencies,
+    thus making it work on Windows out of the box. (Kalle)
+  . Removed support for BeOS. (Kalle)
+  . Add PHP_VERSION to phpinfo() <title/>. (github/MattJeevas)
+  . Add net_get_interfaces(). (Sara, Joe, Anatol)
+  . Added gc_status(). (Benjamin Eberlei)
+  . Implemented flexible heredoc and nowdoc syntax, per
+    RFC https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes.
+    (Thomas Punt)
+  . Added support for references in list() and array destructuring, per
+    RFC https://wiki.php.net/rfc/list_reference_assignment.
+    (David Walker)
+  . Improved effectiveness of ZEND_SECURE_ZERO for NetBSD and systems
+    without native similar feature. (devnexen)
+  . Added syslog.facility and syslog.ident INI entries for customizing syslog
+    logging. (Philip Prindeville)
+  . Fixed bug #75683 (Memory leak in zend_register_functions() in ZTS mode).
+    (Dmitry)
+  . Fixed bug #75031 (support append mode in temp/memory streams). (adsr)
+  . Fixed bug #74860 (Uncaught exceptions not being formatted properly when
+    error_log set to "syslog"). (Philip Prindeville)
+  . Fixed bug #75220 (Segfault when calling is_callable on parent).
+    (andrewnester)
+  . Fixed bug #69954 (broken links and unused config items in distributed ini
+    files). (petk)
+  . Fixed bug #74922 (Composed class has fatal error with duplicate, equal const
+    properties). (pmmaga)
+  . Fixed bug #63911 (identical trait methods raise errors during composition).
+    (pmmaga)
+  . Fixed bug #75677 (Clang ignores fastcall calling convention on variadic
+    function). (Li-Wen Hsu)
+  . Fixed bug #54043 (Remove inconsitency of internal exceptions and user
+    defined exceptions). (Nikita)
+  . Fixed bug #53033 (Mathematical operations convert objects to integers).
+    (Nikita)
+  . Fixed bug #73108 (Internal class cast handler uses integer instead of
+    float). (Nikita)
+  . Fixed bug #75765 (Fatal error instead of Error exception when base class is
+    not found). (Timur Ibragimov)
+  . Fixed bug #76198 (Wording: "iterable" is not a scalar type). (Levi Morrison)
+  . Fixed bug #76137 (config.guess/config.sub do not recognize RISC-V). (cmb)
+  . Fixed bug #76427 (Segfault in zend_objects_store_put). (Laruence)
+  . Fixed bug #76422 (ftruncate fails on files > 2GB). (Anatol)
+  . Fixed bug #76509 (Inherited static properties can be desynchronized from
+    their parent by ref). (Nikita)
+  . Fixed bug #76439 (Changed behaviour in unclosed HereDoc). (Nikita, tpunt)
+  . Fixed bug #63217 (Constant numeric strings become integers when used as
+    ArrayAccess offset). (Rudi Theunissen, Dmitry)
+  . Fixed bug #33502 (Some nullary functions don't check the number of
+    arguments). (cmb)
+  . Fixed bug #76392 (Error relocating sapi/cli/php: unsupported relocation
+    type 37). (Peter Kokot)
+  . The declaration and use of case-insensitive constants has been deprecated.
+    (Nikita)
+  . Added syslog.filter INI entry for syslog filtering. (Philip Prindeville)
+  . Fixed bug #76667 (Segfault with divide-assign op and __get + __set).
+    (Laruence)
+  . Fixed bug #76030 (RE2C_FLAGS rarely honoured) (Cristian Rodríguez)
+  . Fixed broken zend_read_static_property (Laruence)
+  . Fixed bug #76773 (Traits used on the parent are ignored for child classes).
+    (daverandom)
+  . Fixed bug #76767 (‘asm’ operand has impossible constraints in zend_operators.h).
+    (ondrej)
+  . Fixed bug #76752 (Crash in ZEND_COALESCE_SPEC_TMP_HANDLER - assertion in
+    _get_zval_ptr_tmp failed). (Laruence)
+  . Fixed bug #76820 (Z_COPYABLE invalid definition). (mvdwerve, cmb)
+  . Fixed bug #76510 (file_exists() stopped working for phar://). (cmb)
+  . Fixed bug #76869 (Incorrect bypassing protected method accessibilty check).
+    (Dmitry)
+  . Fixed bug #72635 (Undefined class used by class constant in constexpr
+    generates fatal error). (Nikita)
+  . Fixed bug #76947 (file_put_contents() blocks the directory of the file
+    (__DIR__)). (Anatol)
+  . Fixed bug #76979 (define() error message does not mention resources as
+    valid values). (Michael Moravec)
+  . Fixed bug #76825 (Undefined symbols ___cpuid_count). (Laruence, cmb)
+  . Fixed bug #77110 (undefined symbol zend_string_equal_val in C++ build).
+    (Remi)
+
+- BCMath:
+  . Implemented FR #67855 (No way to get current scale in use). (Chris Wright,
+    cmb)
+  . Fixed bug #66364 (BCMath bcmul ignores scale parameter). (cmb)
+  . Fixed bug #75164 (split_bc_num() is pointless). (cmb)
+  . Fixed bug #75169 (BCMath errors/warnings bypass PHP's error handling). (cmb)
+
+- CLI:
+  . Fixed bug #44217 (Output after stdout/stderr closed cause immediate exit
+    with status 0). (Robert Lu)
+  . Fixed bug #77111 (php-win.exe corrupts unicode symbols from cli
+    parameters). (Anatol)
+
+- cURL:
+  . Expose curl constants from curl 7.50 to 7.61. (Pierrick)
+  . Fixed bug #74125 (Fixed finding CURL on systems with multiarch support).
+    (cebe)
+
+- Date:
+  . Implemented FR #74668: Add DateTime::createFromImmutable() method.
+    (majkl578, Rican7)
+  . Fixed bug #75222 (DateInterval microseconds property always 0). (jhdxr)
+  . Fixed bug #68406 (calling var_dump on a DateTimeZone object modifies it).
+    (jhdxr)
+  . Fixed bug #76131 (mismatch arginfo for date_create). (carusogabriel)
+  . Updated timelib to 2018.01RC1 to address several bugs:
+    . Fixed bug #75577 (DateTime::createFromFormat does not accept 'v' format
+      specifier). (Derick)
+    . Fixed bug #75642 (Wrap around behaviour for microseconds is not working).
+      (Derick)
+
+- DBA:
+  . Fixed bug #75264 (compiler warnings emitted). (petk)
+
+- DOM:
+  . Fixed bug #76285 (DOMDocument::formatOutput attribute sometimes ignored).
+    (Andrew Nester, Laruence, Anatol)
+
+- Fileinfo:
+  . Fixed bug #77095 (slowness regression in 7.2/7.3 (compared to 7.1)).
+    (Anatol)
+
+- Filter:
+  . Added the 'add_slashes' sanitization mode (FILTER_SANITIZE_ADD_SLASHES).
+	(Kalle)
+
+- FPM:
+  . Added fpm_get_status function. (Till Backhaus)
+  . Fixed bug #62596 (getallheaders() missing with PHP-FPM). (Remi)
+  . Fixed bug #69031 (Long messages into stdout/stderr are truncated
+    incorrectly) - added new log related FPM configuration options:
+    log_limit, log_buffering and decorate_workers_output. (Jakub Zelenka)
+
+- ftp:
+  . Fixed bug #77151 (ftp_close(): SSL_read on shutdown). (Remi)
+
+- GD:
+  . Added support for WebP in imagecreatefromstring(). (Andreas Treichel, cmb)
+
+- GMP:
+  . Export internal structures and accessor helpers for GMP object. (Sara)
+  . Added gmp_binomial(n, k). (Nikita)
+  . Added gmp_lcm(a, b). (Nikita)
+  . Added gmp_perfect_power(a). (Nikita)
+  . Added gmp_kronecker(a, b). (Nikita)
+
+- iconv:
+  . Fixed bug #53891 (iconv_mime_encode() fails to Q-encode UTF-8 string). (cmb)
+  . Fixed bug #77147 (Fixing 60494 ignored ICONV_MIME_DECODE_CONTINUE_ON_ERROR).
+    (cmb)
+
+- IMAP:
+  . Fixed bug #77020 (null pointer dereference in imap_mail). (cmb)
+  . Fixed bug #77153 (imap_open allows to run arbitrary shell commands via
+    mailbox parameter). (Stas)
+
+- Interbase:
+  . Fixed bug #75453 (Incorrect reflection for ibase_[p]connect). (villfa)
+  . Fixed bug #76443 (php+php_interbase.dll crash on module_shutdown). (Kalle)
+
+
+- intl:
+  . Fixed bug #75317 (UConverter::setDestinationEncoding changes source instead
+    of destination). (andrewnester)
+  . Fixed bug #76829 (Incorrect validation of domain on idn_to_utf8()
+    function). (Anatol)
+
+- JSON:
+  . Added JSON_THROW_ON_ERROR flag. (Andrea)
+
+- LDAP:
+  . Added ldap_exop_refresh helper for EXOP REFRESH operation with dds overlay.
+    (Come)
+  . Added full support for sending and parsing ldap controls. (Come)
+  . Fixed bug #49876 (Fix LDAP path lookup on 64-bit distros). (dzuelke)
+
+- libxml2:
+  . Fixed bug #75871 (use pkg-config where available). (pmmaga)
+
+- litespeed:
+  . Fixed bug #75248 (Binary directory doesn't get created when building
+    only litespeed SAPI). (petk)
+  . Fixed bug #75251 (Missing program prefix and suffix). (petk)
+
+- MBstring:
+  . Updated to Oniguruma 6.9.0. (cmb)
+  . Fixed bug #65544 (mb title case conversion-first word in quotation isn't
+    capitalized). (Nikita)
+  . Fixed bug #71298 (MB_CASE_TITLE misbehaves with curled apostrophe/quote).
+    (Nikita)
+  . Fixed bug #73528 (Crash in zif_mb_send_mail). (Nikita)
+  . Fixed bug #74929 (mbstring functions version 7.1.1 are slow compared to 5.3
+    on Windows). (Nikita)
+  . Fixed bug #76319 (mb_strtolower with invalid UTF-8 causes segmentation
+    fault). (Nikita)
+  . Fixed bug #76574 (use of undeclared identifiers INT_MAX and LONG_MAX). (cmb)
+  . Fixed bug #76594 (Bus Error due to unaligned access in zend_ini.c
+    OnUpdateLong). (cmb, Nikita)
+  . Fixed bug #76706 (mbstring.http_output_conv_mimetypes is ignored). (cmb)
+  . Fixed bug #76958 (Broken UTF7-IMAP conversion). (Nikita)
+  . Fixed bug #77025 (mb_strpos throws Unknown encoding or conversion error).
+    (Nikita)
+  . Fixed bug #77165 (mb_check_encoding crashes when argument given an empty
+    array). (Nikita)
+
+- Mysqlnd:
+  . Fixed bug #76386 (Prepared Statement formatter truncates fractional seconds
+    from date/time column). (Victor Csiky)
+
+- ODBC:
+  . Removed support for ODBCRouter. (Kalle)
+  . Removed support for Birdstep. (Kalle)
+  . Fixed bug #77079 (odbc_fetch_object has incorrect type signature).
+    (Jon Allen)
+
+- Opcache:
+  . Fixed bug #76466 (Loop variable confusion). (Dmitry, Laruence, Nikita)
+  . Fixed bug #76463 (var has array key type but not value type). (Laruence)
+  . Fixed bug #76446 (zend_variables.c:73: zend_string_destroy: Assertion
+    `!(zval_gc_flags((str)->gc)). (Nikita, Laruence)
+  . Fixed bug #76711 (OPcache enabled triggers false-positive "Illegal string
+    offset"). (Dmitry)
+  . Fixed bug #77058 (Type inference in opcache causes side effects). (Nikita)
+  . Fixed bug #77092 (array_diff_key() - segmentation fault). (Nikita)
+
+- OpenSSL:
+  . Added openssl_pkey_derive function. (Jim Zubov)
+  . Add min_proto_version and max_proto_version ssl stream options as well as
+    related constants for possible TLS protocol values. (Jakub Zelenka)
+
+- PCRE:
+  . Implemented https://wiki.php.net/rfc/pcre2-migration. (Anatol, Dmitry)
+  . Upgrade PCRE2 to 10.32. (Anatol)
+  . Fixed bug #75355 (preg_quote() does not quote # control character).
+    (Michael Moravec)
+  . Fixed bug #76512 (\w no longer includes unicode characters). (cmb)
+  . Fixed bug #76514 (Regression in preg_match makes it fail with
+    PREG_JIT_STACKLIMIT_ERROR). (Anatol)
+  . Fixed bug #76909 (preg_match difference between 7.3 and < 7.3). (Anatol)
+
+- PDO_DBlib:
+  . Implemented FR #69592 (allow 0-column rowsets to be skipped automatically).
+    (fandrieu)
+  . Expose TDS version as \PDO::DBLIB_ATTR_TDS_VERSION attribute on \PDO
+    instance. (fandrieu)
+  . Treat DATETIME2 columns like DATETIME. (fandrieu)
+  . Fixed bug #74243 (allow locales.conf to drive datetime format). (fandrieu)
+
+- PDO_Firebird:
+  . Fixed bug #74462 (PDO_Firebird returns only NULLs for results with boolean
+    for FIREBIRD >= 3.0). (Dorin Marcoci)
+
+- PDO_OCI:
+  . Fixed bug #74631 (PDO_PCO with PHP-FPM: OCI environment initialized
+    before PHP-FPM sets it up). (Ingmar Runge)
+
+- PDO SQLite
+  . Add support for additional open flags
+
+- pgsql:
+  . Added new error constants for pg_result_error(): PGSQL_DIAG_SCHEMA_NAME,
+    PGSQL_DIAG_TABLE_NAME, PGSQL_DIAG_COLUMN_NAME, PGSQL_DIAG_DATATYPE_NAME,
+    PGSQL_DIAG_CONSTRAINT_NAME and PGSQL_DIAG_SEVERITY_NONLOCALIZED. (Kalle)
+  . Fixed bug #77047 (pg_convert has a broken regex for the 'TIME WITHOUT
+    TIMEZONE' data type). (Andy Gajetzki)
+
+- phar:
+  . Fixed bug #74991 (include_path has a 4096 char limit in some cases).
+    (bwbroersma)
+  . Fixed bug #65414 (deal with leading slash when adding files correctly).
+    (bishopb)
+
+- readline:
+  . Added completion_append_character and completion_suppress_append options
+    to readline_info() if linked against libreadline. (krageon)
+
+- Session:
+  . Fixed bug #74941 (session fails to start after having headers sent).
+    (morozov)
+
+- SimpleXML:
+  . Fixed bug #54973 (SimpleXML casts integers wrong). (Nikita)
+  . Fixed bug #76712 (Assignment of empty string creates extraneous text node).
+    (cmb)
+
+- Sockets:
+  . Fixed bug #67619 (Validate length on socket_write). (thiagooak)
+
+- SOAP:
+  . Fixed bug #75464 (Wrong reflection on SoapClient::__setSoapHeaders).
+    (villfa)
+  . Fixed bug #70469 (SoapClient generates E_ERROR even if exceptions=1 is
+    used). (Anton Artamonov)
+  . Fixed bug #50675 (SoapClient can't handle object references correctly).
+    (Cameron Porter)
+  . Fixed bug #76348 (WSDL_CACHE_MEMORY causes Segmentation fault). (cmb)
+  . Fixed bug #77141 (Signedness issue in SOAP when precision=-1). (cmb)
+
+- SPL:
+  . Fixed bug #74977 (Appending AppendIterator leads to segfault).
+    (Andrew Nester)
+  . Fixed bug #75173 (incorrect behavior of AppendIterator::append in foreach
+    loop). (jhdxr)
+  . Fixed bug #74372 (autoloading file with syntax error uses next autoloader,
+    may hide parse error). (Nikita)
+  . Fixed bug #75878 (RecursiveTreeIterator::setPostfix has wrong signature).
+    (cmb)
+  . Fixed bug #74519 (strange behavior of AppendIterator). (jhdxr)
+  . Fixed bug #76131 (mismatch arginfo for splarray constructor).
+    (carusogabriel)
+
+- SQLite3:
+  . Updated bundled libsqlite to 3.24.0. (cmb)
+
+- Standard:
+  . Added is_countable() function. (Gabriel Caruso)
+  . Added support for the SameSite cookie directive, including an alternative
+    signature for setcookie(), setrawcookie() and session_set_cookie_params().
+    (Frederik Bosch, pmmaga)
+  . Remove superfluous warnings from inet_ntop()/inet_pton(). (daverandom)
+  . Fixed bug #75916 (DNS_CAA record results contain garbage). (Mike,
+    Philip Sharp)
+  . Fixed unserialize(), to disable creation of unsupported data structures
+    through manually crafted strings. (Dmitry)
+  . Fixed bug #75409 (accept EFAULT in addition to ENOSYS as indicator
+    that getrandom() is missing). (sarciszewski)
+  . Fixed bug #74719 (fopen() should accept NULL as context). (Alexander Holman)
+  . Fixed bug #69948 (path/domain are not sanitized in setcookie). (cmb)
+  . Fixed bug #75996 (incorrect url in header for mt_rand). (tatarbj)
+  . Added hrtime() function, to get high resolution time. (welting)
+  . Fixed bug #48016 (stdClass::__setState is not defined although var_export()
+    uses it). (Andrea)
+  . Fixed bug #76136 (stream_socket_get_name should enclose IPv6 in brackets).
+    (seliver)
+  . Fixed bug #76688 (Disallow excessive parameters after options array).
+    (pmmaga)
+  . Fixed bug #76713 (Segmentation fault caused by property corruption).
+    (Laruence)
+  . Fixed bug #76755 (setcookie does not accept "double" type for expire time).
+    (Laruence)
+  . Fixed bug #76674 (improve array_* failure messages exposing what was passed
+    instead of an array). (carusogabriel)
+  . Fixed bug #76803 (ftruncate changes file pointer). (Anatol)
+  . Fixed bug #76818 (Memory corruption and segfault). (Remi)
+  . Fixed bug #77081 (ftruncate() changes seek pointer in c mode). (cmb, Anatol)
+
+- Testing:
+  . Implemented FR #62055 (Make run-tests.php support --CGI-- sections). (cmb)
+
+- Tidy:
+  . Support using tidyp instead of tidy. (devnexen)
+  . Fixed bug #74707 (Tidy has incorrect ReflectionFunction param counts for
+    functions taking tidy). (Gabriel Caruso)
+  . Fixed arginfo for tidy::__construct(). (Tyson Andre)
+
+- Tokenizer:
+  . Fixed bug #76437 (token_get_all with TOKEN_PARSE flag fails to recognise
+    close tag). (Laruence)
+  . Fixed bug #75218 (Change remaining uncatchable fatal errors for parsing
+    into ParseError). (Nikita)
+  . Fixed bug #76538 (token_get_all with TOKEN_PARSE flag fails to recognise
+    close tag with newline). (Nikita)
+  . Fixed bug #76991 (Incorrect tokenization of multiple invalid flexible
+    heredoc strings). (Nikita)
+
+- XML:
+  . Fixed bug #71592 (External entity processing never fails). (cmb)
+
+- Zlib:
+  . Added zlib/level context option for compress.zlib wrapper. (Sara)
+
+08 Nov 2018, PHP 7.2.12
+
+- Core:
+  . Fixed bug #76846 (Segfault in shutdown function after memory limit error).
+    (Nikita)
+  . Fixed bug #76946 (Cyclic reference in generator not detected). (Nikita)
+  . Fixed bug #77035 (The phpize and ./configure create redundant .deps file).
+    (Peter Kokot)
+  . Fixed bug #77041 (buildconf should output error messages to stderr)
+    (Mizunashi Mana)
+
+- Date:
+  . Upgraded timelib to 2017.08. (Derick)
+  . Fixed bug #75851 (Year component overflow with date formats "c", "o", "r"
+    and "y"). (Adam Saponara)
+  . Fixed bug #77007 (fractions in `diff()` are not correctly normalized).
+    (Derick)
+
+- FCGI:
+  . Fixed #76948 (Failed shutdown/reboot or end session in Windows). (Anatol)
+  . Fixed bug #76954 (apache_response_headers removes last character from header
+    name). (stodorovic)
+
+- FTP:
+  . Fixed bug #76972 (Data truncation due to forceful ssl socket shutdown).
+    (Manuel Mausz)
+
+- intl:
+  . Fixed bug #76942 (U_ARGUMENT_TYPE_MISMATCH). (anthrax at unixuser dot org)
+
+- Reflection:
+  . Fixed bug #76936 (Objects cannot access their private attributes while
+    handling reflection errors). (Nikita)
+  . Fixed bug #66430 (ReflectionFunction::invoke does not invoke closure with
+    object scope). (Nikita)
+
+- Sodium:
+  . Some base64 outputs were truncated; this is not the case any more.
+    (jedisct1)
+  . block sizes >= 256 bytes are now supposed by sodium_pad() even
+    when an old version of libsodium has been installed. (jedisct1)
+  . Fixed bug #77008 (sodium_pad() could read (but not return nor write)
+    uninitialized memory when trying to pad an empty input). (jedisct1)
+
+- Standard:
+  . Fixed bug #76965 (INI_SCANNER_RAW doesn't strip trailing whitespace).
+    (Pierrick)
+
+- Tidy:
+  . Fixed bug #77027 (tidy::getOptDoc() not available on Windows). (cmb)
+
+- XML:
+  . Fixed bug #30875 (xml_parse_into_struct() does not resolve entities). (cmb)
+  . Add support for getting SKIP_TAGSTART and SKIP_WHITE options. (cmb)
+
+- XMLRPC:
+  . Fixed bug #75282 (xmlrpc_encode_request() crashes). (cmb)
+
+11 Oct 2018, PHP 7.2.11
+
+- Core:
+  . Fixed bug #76800 (foreach inconsistent if array modified during loop).
+    (Dmitry)
+  . Fixed bug #76901 (method_exists on SPL iterator passthrough method corrupts
+    memory). (Nikita)
+
+- CURL:
+  . Fixed bug #76480 (Use curl_multi_wait() so that timeouts are respected).
+    (Pierrick)
+
+- iconv:
+  . Fixed bug #66828 (iconv_mime_encode Q-encoding longer than it should be).
+    (cmb)
+
+- Opcache:
+  . Fixed bug #76832 (ZendOPcache.MemoryBase periodically deleted by the OS).
+    (Anatol)
+  . Fixed bug #76796 (Compile-time evaluation of disabled function in opcache
+    causes segfault). (Nikita)
+
+- POSIX:
+  . Fixed bug #75696 (posix_getgrnam fails to print details of group). (cmb)
+
+- Reflection:
+  . Fixed bug #74454 (Wrong exception being thrown when using ReflectionMethod).
+    (cmb)
+
+- Standard:
+  . Fixed bug #73457 (Wrong error message when fopen FTP wrapped fails to open
+    data connection). (Ville Hukkamäki)
+  . Fixed bug #74764 (Bindto IPv6 works with file_get_contents but fails with
+    stream_socket_client). (Ville Hukkamäki)
+  . Fixed bug #75533 (array_reduce is slow when $carry is large array).
+    (Manabu Matsui)
+
+- XMLRPC:
+  . Fixed bug #76886 (Can't build xmlrpc with expat). (Thomas Petazzoni, cmb)
+
+- Zlib:
+  . Fixed bug #75273 (php_zlib_inflate_filter() may not update bytes_consumed).
+    (Martin Burke, cmb)
+
+13 Sep 2018, PHP 7.2.10
+
+- Core:
+  . Fixed bug #76754 (parent private constant in extends class memory leak).
+    (Laruence)
+  . Fixed bug #72443 (Generate enabled extension). (petk)
+  . Fixed bug #75797 (Memory leak when using class_alias() in non-debug mode).
+    (Massimiliano Braglia)
+
+- Apache2:
+  . Fixed bug #76582 (Apache bucket brigade sometimes becomes invalid). (stas)
+
+- Bz2:
+  . Fixed arginfo for bzcompress. (Tyson Andre)
+
+- gettext:
+  . Fixed bug #76517 (incorrect restoring of LDFLAGS). (sji)
+
+- iconv:
+  . Fixed bug #68180 (iconv_mime_decode can return extra characters in a
+    header). (cmb)
+  . Fixed bug #63839 (iconv_mime_decode_headers function is skipping headers).
+    (cmb)
+  . Fixed bug #60494 (iconv_mime_decode does ignore special characters). (cmb)
+  . Fixed bug #55146 (iconv_mime_decode_headers() skips some headers). (cmb)
+
+- intl:
+  . Fixed bug #74484 (MessageFormatter::formatMessage memory corruption with
+    11+ named placeholders). (Anatol)
+
+- libxml:
+  . Fixed bug #76777 ("public id" parameter of libxml_set_external_entity_loader
+    callback undefined). (Ville Hukkamäki)
+
+- mbstring:
+  . Fixed bug #76704 (mb_detect_order return value varies based on argument
+    type). (cmb)
+
+- Opcache:
+  . Fixed bug #76747 (Opcache treats path containing "test.pharma.tld" as a phar
+    file). (Laruence)
+
+- OpenSSL:
+  . Fixed bug #76705 (unusable ssl => peer_fingerprint in
+    stream_context_create()). (Jakub Zelenka)
+
+- phpdbg:
+  . Fixed bug #76595 (phpdbg man page contains outdated information).
+    (Kevin Abel)
+
+- SPL:
+  . Fixed bug #68825 (Exception in DirectoryIterator::getLinkTarget()). (cmb)
+  . Fixed bug #68175 (RegexIterator pregFlags are NULL instead of 0). (Tim
+    Siebels)
+
+- Standard:
+  . Fixed bug #76778 (array_reduce leaks memory if callback throws exception).
+    (cmb)
+
+- zlib:
+  . Fixed bug #65988 (Zlib version check fails when an include/zlib/ style dir
+    is passed to the --with-zlib configure option). (Jay Bonci)
+  . Fixed bug #76709 (Minimal required zlib library is 1.2.0.4). (petk)
+
+16 Aug 2018, PHP 7.2.9
+
+- Calendar:
+  . Fixed bug #52974 (jewish.c: compile error under Windows with GBK charset).
+    (cmb)
+
+- Filter:
+  . Fixed bug #76366 (References in sub-array for filtering breaks the filter).
+    (ZiHang Gao)
+
+- PDO_Firebird:
+  . Fixed bug #76488 (Memory leak when fetching a BLOB field). (Simonov Denis)
+
+- PDO_PgSQL:
+  . Fixed bug #75402 (Possible Memory Leak using PDO::CURSOR_SCROLL option).
+    (Anatol)
+
+- SQLite3:
+  . Fixed #76665 (SQLite3Stmt::bindValue() with SQLITE3_FLOAT doesn't juggle).
+    (cmb)
+
+- Standard:
+  . Fixed bug #73817 (Incorrect entries in get_html_translation_table). (cmb)
+  . Fixed bug #68553 (array_column: null values in $index_key become incrementing
+    keys in result). (Laruence)
+  . Fixed bug #76643 (Segmentation fault when using `output_add_rewrite_var`).
+    (cmb)
+
+- Zip:
+  . Fixed bug #76524 (ZipArchive memory leak (OVERWRITE flag and empty archive)).
+    (Timur Ibragimov)
+
+19 Jul 2018, PHP 7.2.8
+
+- Core:
+  . Fixed bug #76534 (PHP hangs on 'illegal string offset on string references
+    with an error handler). (Laruence)
+  . Fixed bug #76520 (Object creation leaks memory when executed over HTTP).
+    (Nikita)
+  . Fixed bug #76502 (Chain of mixed exceptions and errors does not serialize
+    properly). (Nikita)
+
+- Date:
+  . Fixed bug #76462 (Undefined property: DateInterval::$f). (Anatol)
+
+- EXIF:
+  . Fixed bug #76409 (heap use after free in _php_stream_free). (cmb)
+  . Fixed bug #76423 (Int Overflow lead to Heap OverFlow in
+    exif_thumbnail_extract of exif.c). (Stas)
+  . Fixed bug #76557 (heap-buffer-overflow (READ of size 48) while reading exif
+    data). (Stas)
+
+- FPM:
+  . Fixed bug #73342 (Vulnerability in php-fpm by changing stdin to
+    non-blocking). (Nikita)
+
+- GMP:
+  . Fixed bug #74670 (Integer Underflow when unserializing GMP and possible
+    other classes). (Nikita)
+
+- intl:
+  . Fixed bug #76556 (get_debug_info handler for BreakIterator shows wrong
+    type). (cmb)
+
+- mbstring:
+  . Fixed bug #76532 (Integer overflow and excessive memory usage
+    in mb_strimwidth). (MarcusSchwarz)
+
+- Opcache:
+  . Fixed bug #76477 (Opcache causes empty return value).
+    (Nikita, Laruence)
+
+- PGSQL:
+  . Fixed bug #76548 (pg_fetch_result did not fetch the next row). (Anatol)
+
+- phpdbg:
+  . Fix arginfo wrt. optional/required parameters. (cmb)
+
+- Reflection:
+  . Fixed bug #76536 (PHP crashes with core dump when throwing exception in
+    error handler). (Laruence)
+  . Fixed bug #75231 (ReflectionProperty#getValue() incorrectly works with
+    inherited classes). (Nikita)
+
+- Standard:
+  . Fixed bug #76505 (array_merge_recursive() is duplicating sub-array keys).
+    (Laruence)
+  . Fixed bug #71848 (getimagesize with $imageinfo returns false). (cmb)
+
+- Win32:
+  . Fixed bug #76459 (windows linkinfo lacks openbasedir check). (Anatol)
+
+- ZIP:
+  . Fixed bug #76461 (OPSYS_Z_CPM defined instead of OPSYS_CPM).
+    (Dennis Birkholz, Remi)
+
+07 Jun 2018, PHP 7.2.7
+
+- Core:
+  . Fixed bug #76337 (segfault when opcache enabled + extension use
+    zend_register_class_alias). (xKhorasan)
+
+- CLI Server:
+  . Fixed bug #76333 (PHP built-in server does not find files if root path
+    contains special characters). (Anatol)
+
+- OpenSSL:
+  . Fixed bug #76296 (openssl_pkey_get_public does not respect open_basedir).
+    (Erik Lax, Jakub Zelenka)
+  . Fixed bug #76174 (openssl extension fails to build with LibreSSL 2.7).
+    (Jakub Zelenka)
+
+- SPL:
+  . Fixed bug #76367 (NoRewindIterator segfault 11). (Laruence)
+
+- Standard:
+  . Fixed bug #76410 (SIGV in zend_mm_alloc_small). (Laruence)
+  . Fixed bug #76335 ("link(): Bad file descriptor" with non-ASCII path).
+    (Anatol)
+
+24 May 2018, PHP 7.2.6
+
+- EXIF:
+  . Fixed bug #76164 (exif_read_data zend_mm_heap corrupted). (cmb)
+
+- FPM:
+  . Fixed bug #76075 --with-fpm-acl wrongly tries to find libacl on FreeBSD.
+    (mgorny)
+
+- intl:
+  . Fixed bug #74385 (Locale::parseLocale() broken with some arguments).
+    (Anatol)
+
+- Opcache:
+  . Fixed bug #76205 (PHP-FPM sporadic crash when running Infinitewp). (Dmitry)
+  . Fixed bug #76275 (Assertion failure in file cache when unserializing empty
+    try_catch_array). (Nikita)
+  . Fixed bug #76281 (Opcache causes incorrect "undefined variable" errors).
+    (Nikita)
+
+- Reflection:
+  . Fixed arginfo of array_replace(_recursive) and array_merge(_recursive).
+    (carusogabriel)
+
+- Session:
+  . Fixed bug #74892 (Url Rewriting (trans_sid) not working on urls that start
+    with "#"). (Andrew Nester)
+
+26 Apr 2018, PHP 7.2.5
+
+- Core:
+  . Fixed bug #75722 (Convert valgrind detection to configure option).
+    (Michael Heimpold)
+
+- Date:
+  . Fixed bug #76131 (mismatch arginfo for date_create). (carusogabriel)
+
+- Exif:
+  . Fixed bug #76130 (Heap Buffer Overflow (READ: 1786) in exif_iif_add_value).
+    (Stas)
+
+- FPM:
+  . Fixed bug #68440 (ERROR: failed to reload: execvp() failed: Argument list
+    too long). (Jacob Hipps)
+  . Fixed incorrect write to getenv result in FPM reload. (Jakub Zelenka)
+
+- GD:
+  . Fixed bug #52070 (imagedashedline() - dashed line sometimes is not visible).
+    (cmb)
+
+- iconv:
+  . Fixed bug #76249 (stream filter convert.iconv leads to infinite loop on
+    invalid sequence). (Stas)
+
+- intl:
+  . Fixed bug #76153 (Intl compilation fails with icu4c 61.1). (Anatol)
+
+- ldap:
+  . Fixed bug #76248 (Malicious LDAP-Server Response causes Crash). (Stas)
+
+- mbstring:
+  . Fixed bug #75944 (Wrong cp1251 detection). (dmk001)
+  . Fixed bug #76113 (mbstring does not build with Oniguruma 6.8.1).
+    (chrullrich, cmb)
+
+- ODBC:
+  . Fixed bug #76088 (ODBC functions are not available by default on Windows).
+    (cmb)
+
+- Opcache:
+  . Fixed bug #76094 (Access violation when using opcache). (Laruence)
+
+- Phar:
+  . Fixed bug #76129 (fix for CVE-2018-5712 may not be complete). (Stas)
+
+- phpdbg:
+  . Fixed bug #76143 (Memory corruption: arbitrary NUL overwrite). (Laruence)
+
+- SPL:
+  . Fixed bug #76131 (mismatch arginfo for splarray constructor).
+    (carusogabriel)
+
+- standard:
+  . Fixed bug #74139 (mail.add_x_header default inconsistent with docs). (cmb)
+  . Fixed bug #75996 (incorrect url in header for mt_rand). (tatarbj)
+
+29 Mar 2018, PHP 7.2.4
+
+- Core:
+  . Fixed bug #76025 (Segfault while throwing exception in error_handler).
+    (Dmitry, Laruence)
+  . Fixed bug #76044 ('date: illegal option -- -' in ./configure on FreeBSD).
+    (Anatol)
+
+- FPM:
+  . Fixed bug #75605 (Dumpable FPM child processes allow bypassing opcache
+    access controls). (Jakub Zelenka)
+
+- FTP:
+  . Fixed ftp_pasv arginfo. (carusogabriel)
+
+-GD:
+  . Fixed bug #73957 (signed integer conversion in imagescale()). (cmb)
+  . Fixed bug #76041 (null pointer access crashed php). (cmb)
+  . Fixed imagesetinterpolation arginfo. (Gabriel Caruso)
+
+- iconv:
+  . Fixed bug #75867 (Freeing uninitialized pointer). (Philip Prindeville)
+
+- Mbstring:
+  . Fixed bug #62545 (wrong unicode mapping in some charsets). (cmb)
+
+- Opcache:
+  . Fixed bug #75969 (Assertion failure in live range DCE due to block pass
+    misoptimization). (Nikita)
+
+- OpenSSL:
+  . Fixed openssl_* arginfos. (carusogabriel)
+
+- PCNTL:
+  . Fixed bug #75873 (pcntl_wexitstatus returns incorrect on Big_Endian platform
+    (s390x)). (Sam Ding)
+
+- Phar:
+  . Fixed bug #76085 (Segmentation fault in buildFromIterator when directory
+    name contains a \n). (Laruence)
+
+- Standard:
+  . Fixed bug #75961 (Strange references behavior). (Laruence)
+  . Fixed some arginfos. (carusogabriel)
+  . Fixed bug #76068 (parse_ini_string fails to parse "[foo]\nbar=1|>baz" with
+    segfault). (Anatol)
+
+01 Mar 2018, PHP 7.2.3
+
+- Core:
+  . Fixed bug #75864 ("stream_isatty" returns wrong value on s390x). (Sam Ding)
+
+- Apache2Handler:
+  . Fixed bug #75882 (a simple way for segfaults in threadsafe php just with
+    configuration). (Anatol)
+
+- Date:
+  . Fixed bug #75857 (Timezone gets truncated when formatted). (carusogabriel)
+  . Fixed bug #75928 (Argument 2 for `DateTimeZone::listIdentifiers()` should
+    accept `null`). (Pedro Lacerda)
+  . Fixed bug #68406 (calling var_dump on a DateTimeZone object modifies it).
+    (jhdxr)
+
+- LDAP:
+  . Fixed bug #49876 (Fix LDAP path lookup on 64-bit distros). (dzuelke)
+
+- libxml2:
+  . Fixed bug #75871 (use pkg-config where available). (pmmaga)
+
+- PGSQL:
+  . Fixed bug #75838 (Memory leak in pg_escape_bytea()). (ard_1 at mail dot ru)
+
+- Phar:
+  . Fixed bug #54289 (Phar::extractTo() does not accept specific directories to
+    be extracted). (bishop)
+  . Fixed bug #65414 (deal with leading slash while adding files correctly).
+    (bishopb)
+  . Fixed bug #65414 (deal with leading slash when adding files correctly).
+    (bishopb)
+
+- ODBC:
+  . Fixed bug #73725 (Unable to retrieve value of varchar(max) type). (Anatol)
+
+- Opcache:
+  . Fixed bug #75729 (opcache segfault when installing Bitrix). (Nikita)
+  . Fixed bug #75893 (file_get_contents $http_response_header variable bugged
+    with opcache). (Nikita)
+  . Fixed bug #75938 (Modulus value not stored in variable). (Nikita)
+
+- SPL:
+  . Fixed bug #74519 (strange behavior of AppendIterator). (jhdxr)
+
+- Standard:
+  . Fixed bug #75916 (DNS_CAA record results contain garbage). (Mike,
+    Philip Sharp)
+  . Fixed bug #75981 (Prevent reading beyond buffer start in http wrapper).
+    (Stas)
+
+01 Feb 2018, PHP 7.2.2
+
+- Core:
+  . Fixed bug #75742 (potential memleak in internal classes's static members).
+    (Laruence)
+  . Fixed bug #75679 (Path 260 character problem). (Anatol)
+  . Fixed bug #75614 (Some non-portable == in shell scripts). (jdolecek)
+  . Fixed bug #75786 (segfault when using spread operator on generator passed
+    by reference). (Nikita)
+  . Fixed bug #75799 (arg of get_defined_functions is optional). (carusogabriel)
+  . Fixed bug #75396 (Exit inside generator finally results in fatal error).
+    (Nikita)
+
+- FCGI:
+  . Fixed bug #75794 (getenv() crashes on Windows 7.2.1 when second parameter is
+    false). (Anatol)
+
+- IMAP:
+  . Fixed bug #75774 (imap_append HeapCorruction). (Anatol)
+
+- Opcache:
+  . Fixed bug #75720 (File cache not populated after SHM runs full). (Dmitry)
+  . Fixed bug #75687 (var 8 (TMP) has array key type but not value type).
+    (Nikita, Laruence)
+  . Fixed bug #75698 (Using @ crashes php7.2-fpm). (Nikita)
+  . Fixed bug #75579 (Interned strings buffer overflow may cause crash).
+    (Dmitry)
+
+- PDO:
+  . Fixed bug #75616 (PDO extension doesn't allow to be built shared on Darwin).
+    (jdolecek)
+
+- PDO MySQL:
+  . Fixed bug #75615 (PDO Mysql module can't be built as module). (jdolecek)
+
+- PGSQL:
+  . Fixed bug #75671 (pg_version() crashes when called on a connection to
+    cockroach). (magicaltux at gmail dot com)
+
+- Readline:
+  . Fixed bug #75775 (readline_read_history segfaults with empty file).
+    (Anatol)
+
+- SAPI:
+  . Fixed bug #75735 ([embed SAPI] Segmentation fault in
+    sapi_register_post_entry). (Laruence)
+
+- SOAP:
+  . Fixed bug #70469 (SoapClient generates E_ERROR even if exceptions=1 is
+    used). (Anton Artamonov)
+  . Fixed bug #75502 (Segmentation fault in zend_string_release). (Nikita)
+
+- SPL:
+  . Fixed bug #75717 (RecursiveArrayIterator does not traverse arrays by
+    reference). (Nikita)
+  . Fixed bug #75242 (RecursiveArrayIterator doesn't have constants from parent
+    class). (Nikita)
+  . Fixed bug #73209 (RecursiveArrayIterator does not iterate object
+    properties). (Nikita)
+
+- Standard:
+   . Fixed bug #75781 (substr_count incorrect result). (Laruence)
+   . Fixed bug #75653 (array_values don't work on empty array). (Nikita)
+
+- Zip:
+  . Display headers (buildtime) and library (runtime) versions in phpinfo
+    (with libzip >= 1.3.1). (Remi)
+
+04 Jan 2018, PHP 7.2.1
+
+- Core:
+  . Fixed bug #75573 (Segmentation fault in 7.1.12 and 7.0.26). (Laruence)
+  . Fixed bug #75384 (PHP seems incompatible with OneDrive files on demand).
+    (Anatol)
+  . Fixed bug #75525 (Access Violation in vcruntime140.dll). (Anatol)
+  . Fixed bug #74862 (Unable to clone instance when private __clone defined).
+    (Daniel Ciochiu)
+  . Fixed bug #75074 (php-process crash when is_file() is used with strings
+    longer 260 chars). (Anatol)
+  . Fixed bug #69727 (Remove timestamps from build to make it reproducible).
+    (jelle van der Waa)
+
+- CLI server:
+  . Fixed bug #73830 (Directory does not exist). (Anatol)
+
+- FPM:
+  . Fixed bug #64938 (libxml_disable_entity_loader setting is shared between
+    requests). (Remi)
+
+- GD:
+  . Fixed bug #75571 (Potential infinite loop in gdImageCreateFromGifCtx).
+    (Christoph)
+
+- Opcache:
+  . Fixed bug #75608 ("Narrowing occurred during type inference" error).
+    (Laruence, Dmitry)
+  . Fixed bug #75579 (Interned strings buffer overflow may cause crash).
+    (Dmitry)
+  . Fixed bug #75570 ("Narrowing occurred during type inference" error).
+    (Dmitry)
+  . Fixed bug #75681 (Warning: Narrowing occurred during type inference,
+    specific case). (Nikita)
+  . Fixed bug #75556 (Invalid opcode 138/1/1). (Laruence)
+
+- PCRE:
+  . Fixed bug #74183 (preg_last_error not returning error code after error).
+    (Andrew Nester)
+
+- Phar:
+  . Fixed bug #74782 (remove file name from output to avoid XSS). (stas)
+
+- Standard:
+  . Fixed bug #75511 (fread not free unused buffer). (Laruence)
+  . Fixed bug #75514 (mt_rand returns value outside [$min,$max]+ on 32-bit)
+    (Remi)
+  . Fixed bug #75535 (Inappropriately parsing HTTP response leads to PHP
+    segment fault). (Nikita)
+  . Fixed bug #75409 (accept EFAULT in addition to ENOSYS as indicator
+    that getrandom() is missing). (sarciszewski)
+  . Fixed bug #73124 (php_ini_scanned_files() not reporting correctly).
+    (John Stevenson)
+  . Fixed bug #75574 (putenv does not work properly if parameter contains
+    non-ASCII unicode character). (Anatol)
+
+- Zip:
+  . Fixed bug #75540 (Segfault with libzip 1.3.1). (Remi)
+
+30 Nov 2017, PHP 7.2.0
+
+- BCMath:
+  . Fixed bug #46564 (bcmod truncates fractionals). (liborm85)
+
+- CLI:
+  . Fixed bug #74849 (Process is started as interactive shell in PhpStorm).
+    (Anatol)
+  . Fixed bug #74979 (Interactive shell opening instead of script execution
+    with -f flag). (Anatol)
+
+- CLI server:
+  . Fixed bug #60471 (Random "Invalid request (unexpected EOF)" using a router
+    script). (SammyK)
+
+- Core:
+  . Added ZEND_COUNT, ZEND_GET_CLASS, ZEND_GET_CALLED_CLASS, ZEND_GET_TYPE,
+    ZEND_FUNC_NUM_ARGS, ZEND_FUNC_GET_ARGS instructions, to implement
+    corresponding builtin functions. (Dmitry)
+  . "Countable" interface is moved from SPL to Core. (Dmitry)
+  . Added ZEND_IN_ARRAY instruction, implementing optimized in_array() builtin
+    function, through hash lookup in flipped array. (Dmitry)
+  . Removed IS_TYPE_IMMUTABLE (it's the same as COPYABLE & !REFCOUNTED). (Dmitry)
+  . Removed the sql.safe_mode directive. (Kalle)
+  . Removed support for Netware. (Kalle)
+  . Renamed ReflectionClass::isIterateable() to ReflectionClass::isIterable()
+    (alias original name for BC). (Sara)
+  . Fixed bug #54535 (WSA cleanup executes before MSHUTDOWN). (Kalle)
+  . Implemented FR #69791 (Disallow mail header injections by extra headers)
+    (Yasuo)
+  . Implemented FR #49806 (proc_nice() for Windows). (Kalle)
+  . Fix pthreads detection when cross-compiling (ffontaine)
+  . Fixed memory leaks caused by exceptions thrown from destructors. (Bob,
+    Dmitry).
+  . Fixed bug #73215 (uniqid() should use better random source). (Yasuo)
+  . Implemented FR #72768 (Add ENABLE_VIRTUAL_TERMINAL_PROCESSING flag for
+    php.exe). (Michele Locati)
+  . Implemented "Convert numeric keys in object/array casts" RFC, fixes
+    bugs #53838, #61655, #66173, #70925, #72254, etc. (Andrea)
+  . Implemented "Deprecate and Remove Bareword (Unquoted) Strings" RFC.
+    (Rowan Collins)
+  . Raised minimum supported Windows versions to Windows 7/Server 2008 R2.
+    (Anatol)
+  . Implemented minor optimization in array_keys/array_values(). (Sara)
+  . Added PHP_OS_FAMILY constant to determine on which OS we are. (Jan Altensen)
+  . Fixed bug #73987 (Method compatibility check looks to original
+    definition and not parent). (pmmaga)
+  . Fixed bug #73991 (JSON_OBJECT_AS_ARRAY not respected). (Sara)
+  . Fixed bug #74053 (Corrupted class entries on shutdown when a destructor
+    spawns another object). (jim at commercebyte dot com)
+  . Fixed bug #73971 (Filename got limited to MAX_PATH on Win32 when scan
+    directory). (Anatol)
+  . Fixed bug #72359, bug #72451, bug #73706, bug #71115 and others related
+    to interned strings handling in TS builds. (Anatol, Dmitry)
+  . Implemented "Trailing Commas In List Syntax" RFC for group use lists only.
+    (Sammy Kaye Powers)
+  . Fixed bug #74269 (It's possible to override trait property with different
+    loosely-equal value). (pmmaga)
+  . Fixed bug #61970 (Restraining __construct() access level in subclass gives
+    a fatal error). (pmmaga)
+  . Fixed bug #63384 (Cannot override an abstract method with an abstract
+    method). (pmmaga, wes)
+  . Fixed bug #74607 (Traits enforce different inheritance rules). (pmmaga)
+  . Fixed misparsing of abstract unix domain socket names. (Sara)
+  . Change PHP_OS_FAMILY value from "OSX" to "Darwin". (Sebastian, Kalle)
+  . Allow loading PHP/Zend extensions by name in ini files (extension=<name>).
+    (francois at tekwire dot net)
+  . Added object type annotation. (brzuchal)
+  . Fixed bug #74815 (crash with a combination of INI entries at startup).
+    (Anatol)
+  . Fixed bug #74836 (isset on zero-prefixed numeric indexes in array broken).
+    (Dmitry)
+  . Added new VM instuctions ISSET_ISEMPTY_CV and UNSET_CV. Previously they
+    were implemented as ISSET_ISEMPTY_VAR and UNSET_VAR variants with
+    ZEND_QUICK_SET flag. (Nikita, Dmitry)
+  . Fixed bug #49649 (unserialize() doesn't handle changes in property
+    visibility). (pmmaga)
+  . Fixed #74866 (extension_dir = "./ext" now use current directory for base).
+    (Francois Laupretre)
+  . Implemented FR #74963 (Improved error message on fetching property of
+    non-object). (Laruence)
+  . Fixed Bug #75142 (buildcheck.sh check for autoconf version needs to be updated
+    for v2.64). (zizzy at zizzy dot net, Remi)
+  . Fixed bug #74878 (Data race in ZTS builds). (Nikita, Dmitry)
+  . Fixed bug #75515 ("stream_copy_to_stream" doesn't stream anymore). (Sara)
+
+- cURL:
+  . Fixed bug #75093 (OpenSSL support not detected). (Remi)
+  . Better fix for #74125 (use pkg-config instead of curl-config). (Remi)
+
+- Date:
+  . Fixed bug #55407 (Impossible to prototype DateTime::createFromFormat).
+    (kelunik)
+  . Implemented FR #71520 (Adding the DateTime constants to the
+    DateTimeInterface interface). (Majkl578)
+  . Fixed bug #75149 (redefinition of typedefs ttinfo and t1info). (Remi)
+  . Fixed bug #75222 (DateInterval microseconds property always 0). (jhdxr)
+
+- Dba:
+  . Fixed bug #72885 (flatfile: dba_fetch() fails to read replaced entry).
+    (Anatol)
+
+- DOM:
+  . Implement #74837 (Implement Countable for DomNodeList and DOMNamedNodeMap).
+    (Andreas Treichel)
+
+- EXIF:
+  . Added support for vendor specific tags for the following formats:
+    Samsung, DJI, Panasonic, Sony, Pentax, Minolta, Sigma/Foveon, AGFA,
+	Kyocera, Ricoh & Epson. (Kalle)
+  . Fixed bug #72682 (exif_read_data() fails to read all data for some
+    images). (Kalle)
+  . Fixed bug #71534 (Type confusion in exif_read_data() leading to heap
+    overflow in debug mode). (hlt99 at blinkenshell dot org, Kalle)
+  . Fixed bug #68547 (Exif Header component value check error).
+    (sjh21a at gmail dot com, Kalle)
+  . Fixed bug #66443 (Corrupt EXIF header: maximum directory nesting level
+    reached for some cameras). (Kalle)
+  . Fixed Redhat bug #1362571 (PHP not returning full results for
+    exif_read_data function). (Kalle)
+  . Implemented #65187 (exif_read_data/thumbnail: add support for stream
+    resource). (Kalle)
+  . Deprecated the read_exif_data() alias. (Kalle)
+  . Fixed bug #74428 (exif_read_data(): "Illegal IFD size" warning occurs with
+    correct exif format). (bradpiccho at gmail dot com, Kalle)
+  . Fixed bug #72819 (EXIF thumbnails not read anymore). (Kalle)
+  . Fixed bug #62523 (php crashes with segfault when exif_read_data called).
+    (Kalle)
+  . Fixed bug #50660 (exif_read_data(): Illegal IFD offset (works fine with
+    other exif readers). (skinny dot bravo at gmail dot com, Kalle)
+
+- Fileinfo:
+  . Upgrade bundled libmagic to 5.31. (Anatol)
+
+- FPM:
+  . Configuration to limit fpm slow log trace callers. (Sannis)
+  . Fixed bug #75212 (php_value acts like php_admin_value). (Remi)
+
+- FTP:
+  . Implement MLSD for structured listing of directories. (blar)
+  . Added ftp_append() function. (blar)
+
+- GD:
+  . Implemented imageresolution as getter and setter (Christoph)
+  . Fixed bug #74744 (gd.h: stdarg.h include missing for va_list use in
+    gdErrorMethod). (rainer dot jung at kippdata dot de, cmb)
+  . Fixed bug #75111 (Memory disclosure or DoS via crafted .bmp image). (cmb)
+
+- GMP:
+  . Fixed bug #70896 (gmp_fact() silently ignores non-integer input). (Sara)
+
+- Hash:
+  . Changed HashContext from resource to object. (Rouven Weßling, Sara)
+  . Disallowed usage of non-cryptographic hash functions with HMAC and PBKDF2.
+    (Andrey Andreev, Nikita)
+  . Fixed Bug #75284 (sha3 is not supported on bigendian machine). (Remi)
+
+- IMAP:
+  . Fixed bug #72324 (imap_mailboxmsginfo() return wrong size).
+    (ronaldpoon at udomain dot com dot hk, Kalle)
+
+- Intl:
+  . Fixed bug #63790 (test using Spoofchecker which may be unavailable). (Sara)
+  . Fixed bug #75378 ([REGRESSION] IntlDateFormatter::parse() does not change
+    $position argument). (Laruence)
+
+- JSON:
+  . Add JSON_INVALID_UTF8_IGNORE and JSON_INVALID_UTF8_SUBSTITUTE options for
+    json_encode and json_decode to ignore or replace invalid UTF-8 byte
+    sequences - it addresses request #65082. (Jakub Zelenka)
+  . Fixed bug #75185 (Buffer overflow in json_decode() with
+    JSON_INVALID_UTF8_IGNORE or JSON_INVALID). (Jakub Zelenka)
+  . Fixed bug #68567 (JSON_PARTIAL_OUTPUT_ON_ERROR can result in JSON with null
+    key). (Jakub Zelenka)
+
+- LDAP:
+  . Implemented FR #69445 (Support for LDAP EXOP operations)
+  . Fixed support for LDAP_OPT_SERVER_CONTROLS and LDAP_OPT_CLIENT_CONTROLS in ldap_get_option
+  . Fixed passing an empty array to ldap_set_option for client or server controls.
+
+- Mbstring:
+  . Implemented request #66024 (mb_chr() and mb_ord()). (Masakielastic, Yasuo)
+  . Implemented request #65081 (mb_scrub()). (Masakielastic, Yasuo)
+  . Implemented request #69086 (enhancement for mb_convert_encoding() that
+    handles multibyte replacement char nicely). (Masakielastic, Yasuo)
+  . Added array input support to mb_convert_encoding(). (Yasuo)
+  . Added array input support to mb_check_encoding(). (Yasuo)
+  . Fixed bug #69079 (enhancement for mb_substitute_character). (masakielastic)
+  . Update to oniguruma version 6.3.0. (Remi)
+  . Fixed bug #69267 (mb_strtolower fails on titlecase characters). (Nikita)
+
+- Mcrypt:
+  . The deprecated mcrypt extension has been moved to PECL. (leigh)
+
+- Opcache:
+  . Added global optimisation passes based on data flow analysis using Single
+    Static Assignment (SSA) form: Sparse Conditional Constant Propagation (SCCP),
+    Dead Code Elimination (DCE), and removal of unused local variables
+    (Nikita, Dmitry)
+  . Fixed incorect constant conditional jump elimination. (Dmitry)
+  . Fixed bug #75230 (Invalid opcode 49/1/8 using opcache). (Laruence)
+  . Fixed bug (assertion fails with extended info generated). (Laruence)
+  . Fixed bug (Phi sources removel). (Laruence)
+  . Fixed bug #75370 (Webserver hangs on valid PHP text). (Laruence)
+  . Fixed bug #75357 (segfault loading WordPress wp-admin). (Laruence)
+
+- OpenSSL:
+  . Use TLS_ANY for default ssl:// and tls:// negotiation. (kelunik)
+  . Fix leak in openssl_spki_new(). (jelle at vdwaa dot nl)
+  . Added openssl_pkcs7_read() and pk7 parameter to openssl_pkcs7_verify().
+    (jelle at vdwaa dot nl)
+  . Add ssl security_level stream option to support OpenSSL security levels.
+    (Jakub Zelenka).
+  . Allow setting SNI cert and private key in separate files. (Jakub Zelenka)
+  . Fixed bug #74903 (openssl_pkcs7_encrypt() uses different EOL than before).
+    (Anatol)
+  . Automatically load OpenSSL configuration file. (Jakub Zelenka)
+
+- PCRE:
+  . Added support for PCRE JIT fast path API. (dmitry)
+  . Fixed bug #61780 (Inconsistent PCRE captures in match results). (cmb)
+  . Fixed bug #74873 (Minor BC break: PCRE_JIT changes output of preg_match()).
+    (Dmitry)
+  . Fixed bug #75089 (preg_grep() is not reporting PREG_BAD_UTF8_ERROR after
+    first input string). (Dmitry)
+  . Fixed bug #75223 (PCRE JIT broken in 7.2). (Dmitry)
+  . Fixed bug #75285 (Broken build when system libpcre don't have jit support).
+    (Remi)
+
+- phar:
+  . Fixed bug #74196 (phar does not correctly handle names containing dots).
+    (mhagstrand)
+
+- PDO:
+  . Add "Sent SQL" to debug dump for emulated prepares. (Adam Baratz)
+  . Add parameter types for national character set strings. (Adam Baratz)
+
+- PDO_DBlib:
+  . Fixed bug #73234 (Emulated statements let value dictate parameter type).
+    (Adam Baratz)
+  . Fixed bug #73396 (bigint columns are returned as strings). (Adam Baratz)
+  . Expose DB-Library version as \PDO::DBLIB_ATTR_VERSION attribute on \PDO
+    instance. (Adam Baratz)
+  . Add test coverage for bug #72969. (Jeff Farr)
+
+- PDO_OCI:
+  . Fixed Bug #74537 (Align --with-pdo-oci configure option with --with-oci8 syntax).
+    (Tianfang Yang)
+
+- PDO_Sqlite
+  . Switch to sqlite3_prepare_v2() and sqlite3_close_v2() functions (rasmus)
+
+- PHPDBG
+  . Added extended_value to opcode dump output. (Sara)
+
+- Session:
+  . Fixed bug #73461 (Prohibit session save handler recursion). (Yasuo)
+  . PR #2233 Removed register_globals related code and "!" can be used as $_SESSION key name. (Yasuo)
+  . Improved bug #73100 fix. 'user' save handler can only be set by session_set_save_handler()
+  . Fixed bug #74514 (5 session functions incorrectly warn when calling in
+    read-only/getter mode). (Yasuo)
+  . Fixed bug #74936 (session_cache_expire/cache_limiter/save_path() trigger a
+    warning in read mode). (morozov)
+  . Fixed bug #74941 (session fails to start after having headers sent).
+    (morozov)
+
+- Sodium:
+  . New cryptographic extension
+  . Added missing bindings for libsodium > 1.0.13. (Frank)
+
+- SPL:
+  . Fixed bug #71412 (Incorrect arginfo for ArrayIterator::__construct).
+    (tysonandre775 at hotmail dot com)
+  . Added spl_object_id(). (Tyson Andre)
+
+- SQLite3:
+  . Implement writing to blobs. (bohwaz at github dot com)
+  . Update to Sqlite 3.20.1. (cmb)
+
+- Standard:
+  . Fixed bug #69442 (closing of fd incorrect when PTS enabled). (jaytaph)
+  . Fixed bug #74300 (unserialize accepts two plus/minus signs for float number exponent part).
+    (xKerman)
+  . Compatibility with libargon2 versions 20161029 and 20160821.
+    (charlesportwoodii at erianna dot com)
+  . Fixed Bug #74737 (mysqli_get_client_info reflection info).
+    (mhagstrand at gmail dot com)
+  . Add support for extension name as argument to dl().
+    (francois at tekwire dot net)
+  . Fixed bug #74851 (uniqid() without more_entropy performs badly).
+    (Emmanuel Dreyfus)
+  . Fixed bug #74103 (heap-use-after-free when unserializing invalid array
+    size). (Nikita)
+  . Fixed bug #75054 (A Denial of Service Vulnerability was found when
+    performing deserialization). (Nikita)
+  . Fixed bug #75170 (mt_rand() bias on 64-bit machines). (Nikita)
+  . Fixed bug #75221 (Argon2i always throws NUL at the end). (cmb)
+
+- Streams:
+  . Default ssl/single_dh_use and ssl/honor_cipher_order to true. (kelunik)
+
+- XML:
+  . Moved utf8_encode() and utf8_decode() to the Standard extension. (Andrea)
+
+- XMLRPC:
+  . Use Zend MM for allocation in bundled libxmlrpc (Joe)
+
+- ZIP:
+  . Add support for encrypted archives. (Remi)
+  . Use of bundled libzip is deprecated, --with-libzip option is recommended. (Remi)
+  . Fixed Bug #73803 (Reflection of ZipArchive does not show public properties). (Remi)
+  . ZipArchive implements countable, added ZipArchive::count() method. (Remi)
+  . Fix segfault in php_stream_context_get_option call. (Remi)
+  . Fixed bug #75143 (new method setEncryptionName() seems not to exist
+    in ZipArchive). (Anatol)
+
+- zlib:
+  . Expose inflate_get_status() and inflate_get_read_len() functions.
+    (Matthew Trescott)

+ 43 - 0
EVSE/GPL/php-7.3.28/README.EXT_SKEL

@@ -0,0 +1,43 @@
+WHAT IT IS
+
+  It's a tool for automatically creating the basic framework for a PHP extension.
+
+HOW TO USE IT
+
+  Very simple. First, change to the ext/ directory of the PHP sources. Then
+  run the following
+
+   php ext_skel.php --ext extension_name
+
+  and everything you need will be placed in directory ext/extension_name.
+
+  If you don't need to test the existence of any external header files,
+  libraries or functions in them, the extension is ready to be compiled in
+  PHP. To compile the extension, run the following:
+
+    ./buildconf; ./configure --enable-extension_name; make
+
+  The definition of PHP_extension_NAME_VERSION will be present in the
+  php_extension_name.h and injected into the zend_extension_entry definition. This
+  is required by the PECL website for the version string conformity checks
+  against package.xml
+
+SOURCE AND HEADER FILE NAME
+
+  The ext_skel.php script generates 'extension_name.c' and 'php_extension_name.h'
+  as the main source and header files. Keep these names.
+
+  extension functions (User functions) must be named
+
+  extension_name_function()
+
+  When you need to expose extension functions to other extensions, expose functions
+  strictly needed by others. Exposed internal function must be named
+
+  php_extension_name_function()
+
+  See also CODING_STANDARDS.
+
+OTHER OPTIONS
+
+  Run php ext_skel.php --help to see the available options.

+ 141 - 0
EVSE/GPL/php-7.3.28/README.GIT-RULES

@@ -0,0 +1,141 @@
+====================
+  Git Commit Rules
+====================
+
+This is the first file you should be reading when contributing code via Git.
+We'll assume you're basically familiar with Git, but feel free to post
+your questions on the mailing list. Please have a look at
+http://git-scm.com/ for more detailed information on Git.
+
+PHP is developed through the efforts of a large number of people.
+Collaboration is a Good Thing(tm), and Git lets us do this. Thus, following
+some basic rules with regards to Git usage will::
+
+   a. Make everybody happier, especially those responsible for maintaining
+      PHP itself.
+
+   b. Keep the changes consistently well documented and easily trackable.
+
+   c. Prevent some of those 'Oops' moments.
+
+   d. Increase the general level of good will on planet Earth.
+
+Having said that, here are the organizational rules::
+
+   1. Respect other people working on the project.
+
+   2. Discuss any significant changes on the list before committing and get
+      confirmation from the release manager for the given branch.
+
+   3. Look at EXTENSIONS file to see who is the primary maintainer of
+      the code you want to contribute to.
+
+   4. If you "strongly disagree" about something another person did, don't
+      start fighting publicly - take it up in private email.
+
+   5. If you don't know how to do something, ask first!
+
+   6. Test your changes before committing them. We mean it. Really.
+      To do so use "make test".
+
+   7. For development use the --enable-debug switch to avoid memory leaks
+      and the --enable-maintainer-zts switch to ensure your code handles
+      TSRM correctly and doesn't break for those who need that.
+
+Currently we have the following branches in use::
+
+  master    The active development branch.
+
+  PHP-7.2   Is used to release the PHP 7.2.x series. This is a current
+            stable version and is open for bugfixes only.
+
+  PHP-7.1   Is used to release the PHP 7.1.x series. This is a current
+            stable version and is open for bugfixes only.
+
+  PHP-7.0   Is used to release the PHP 7.0.x series. This is an old
+            stable version and is open for security fixes only.
+
+  PHP-5.6   Is used to release the PHP 5.6.x series. This is an old
+            stable version and is open for security fixes only.
+
+  PHP-5.5   This branch is closed.
+
+  PHP-5.4   This branch is closed.
+
+  PHP-5.3   This branch is closed.
+
+  PHP-5.2   This branch is closed.
+
+  PHP-5.1   This branch is closed.
+
+  PHP-4.4   This branch is closed.
+
+  PHP-X.Y.Z These branches are used for the release managers for tagging
+            the releases, hence they are closed to the general public.
+
+The next few rules are more of a technical nature::
+
+   1. All changes should first go to the lowest branch (i.e. 5.6) and then
+      get merged up to all other branches. If a change is not needed for
+      later branches (i.e. fixes for features which were dropped from later
+      branches) an empty merge should be done.
+
+   2. All news updates intended for public viewing, such as new features,
+      bug fixes, improvements, etc., should go into the NEWS file of *any
+      stable release* version with the given change. In other words,
+      news about a bug fix which went into PHP-5.4, PHP-5.5 and master
+      should be noted in both PHP-5.4/NEWS and PHP-5.5/NEWS but
+      not master, which is not a public released version yet.
+
+   3. Do not commit multiple files and dump all messages in one commit. If you
+      modified several unrelated files, commit each group separately and
+      provide a nice commit message for each one. See example below.
+
+   4. Do write your commit message in such a way that it makes sense even
+      without the corresponding diff. One should be able to look at it, and
+      immediately know what was modified. Definitely include the function name
+      in the message as shown below.
+
+   5. In your commit messages, keep each line shorter than 80 characters. And
+      try to align your lines vertically, if they wrap. It looks bad otherwise.
+
+   6. If you modified a function that is callable from PHP, prepend PHP to
+      the function name as shown below.
+
+
+The format of the commit messages is pretty simple.
+
+<max 79 characters short description>\n
+\n
+<long description, 79 chars per line>
+\n
+
+An Example from the git project (commit 2b34e486bc):
+
+pack-objects: Fix compilation with NO_PTHREDS
+
+It looks like commit 99fb6e04 (pack-objects: convert to use
+parse_options(), 2012-02-01) moved the #ifdef NO_PTHREDS around but
+hasn't noticed that the 'arg' variable no longer is available.
+
+If you fix some bugs, you should note the bug ID numbers in your
+commit message. Bug ID should be prefixed by "#" for easier access to
+bug report when developers are browsing CVS via LXR or Bonsai.
+
+Example:
+
+Fixed bug #14016 (pgsql notice handler double free crash bug.)
+
+When you change the NEWS file for a bug fix, then please keep the bugs
+sorted in decreasing order under the fixed version.
+
+You can use OpenGrok (http://lxr.php.net/) and gitweb (http://git.php.net/)
+to look at PHP Git repository in various ways.
+
+
+For further information on the process and further details please refer to
+https://wiki.php.net/vcs/gitworkflow and https://wiki.php.net/vcs/gitfaq
+
+Happy hacking,
+
+PHP Team

+ 79 - 0
EVSE/GPL/php-7.3.28/README.MAILINGLIST_RULES

@@ -0,0 +1,79 @@
+====================
+  Mailinglist Rules
+====================
+
+This is the first file you should be reading before doing any posts on PHP
+mailinglists. Following these rules is considered imperative to the success of
+the PHP project. Therefore expect your contributions to be of much less positive
+impact if you do not follow these rules. More importantly you can actually
+assume that not following these rules will hurt the PHP project.
+
+PHP is developed through the efforts of a large number of people.
+Collaboration is a Good Thing(tm), and mailinglists lets us do this. Thus,
+following some basic rules with regards to mailinglist usage will:
+
+   a. Make everybody happier, especially those responsible for developing PHP
+      itself.
+
+   b. Help in making sure we all use our time more efficiently.
+
+   c. Prevent you from making a fool of yourself in public.
+
+   d. Increase the general level of good will on planet Earth.
+
+
+Having said that, here are the organizational rules:
+
+   1. Respect other people working on the project.
+
+   2. Do not post when you are angry. Any post can wait a few hours. Review
+      your post after a good breather or a good nights sleep.
+
+   3. Make sure you pick the right mailinglist for your posting. Please review
+      the descriptions on the mailinglist overview page
+      (http://www.php.net/mailing-lists.php). When in doubt ask a friend or
+      someone you trust on IRC.
+
+   4. Make sure you know what you are talking about. PHP is a very large project
+      that strives to be very open. The flip side is that the core developers
+      are faced with a lot of requests. Make sure that you have done your
+      research before posting to the entire developer community.
+
+   5. Patches have a much greater chance of acceptance than just asking the
+      PHP developers to implement a feature for you. For one it makes the
+      discussion more concrete and it shows that the poster put thought and time
+      into the request.
+
+   6. If you are posting to an existing thread, make sure that you know what
+      previous posters have said. This is even more important the longer the
+      thread is already.
+
+   7. Please configure your email client to use a real name and keep message
+      signatures to a maximum of 2 lines if at all necessary.
+
+The next few rules are more some general hints:
+
+   1. If you notice that your posting ratio is much higher than that of other
+      people, double check the above rules. Try to wait a bit longer before
+      sending your replies to give other people more time to digest your answers
+      and more importantly give you the opportunity to make sure that you
+      aggregate your current position into a single mail instead of multiple
+      ones.
+
+   2. Consider taking a step back from a very active thread now and then. Maybe
+      talking to some friends and fellow developers will help in understanding
+      the other opinions better.
+
+   3. Do not top post. Place your answer underneath anyone you wish to quote
+      and remove any previous comment that is not relevant to your post.
+
+   4. Do not high-jack threads, by bringing up entirely new topics. Please
+      create an entirely new thread copying anything you wish to quote into the
+      new thread.
+
+Finally, additional hints on how to behave inside the virtual community can be
+found in RFC 1855 (http://www.faqs.org/rfcs/rfc1855.html).
+
+Happy hacking,
+
+PHP Team

+ 139 - 0
EVSE/GPL/php-7.3.28/README.NEW-OUTPUT-API

@@ -0,0 +1,139 @@
+API adjustment to the old output control code:
+
+	Everything now resides beneath the php_output namespace,
+	and there's an API call for every output handler op.
+
+	Checking output control layers status:
+		// Using OG()
+		php_output_get_status();
+
+	Starting the default output handler:
+		// php_start_ob_buffer(NULL, 0, 1);
+		php_output_start_default();
+
+	Starting an user handler by zval:
+		// php_start_ob_buffer(zhandler, chunk_size, erase);
+		php_output_start_user(zhandler, chunk_size, flags);
+
+	Starting an internal handler without context:
+		// php_ob_set_internal_handler(my_php_output_handler_func_t, buffer_size, "output handler name", erase);
+		php_output_start_internal(handler_name, handler_name_len, my_php_output_handler_func_t, chunk_size, flags);
+
+	Starting an internal handler with context:
+		// not possible with old API
+		php_output_handler *h;
+		h = php_output_handler_create_internal(handler_name, handler_name_len, my_php_output_handler_context_func_t, chunk_size, flags);
+		php_output_handler_set_context(h, my_context, my_context_dtor);
+		php_output_handler_start(h);
+
+	Testing whether a certain output handler has already been started:
+		// php_ob_handler_used("output handler name");
+		php_output_handler_started(handler_name, handler_name_len);
+
+	Flushing one output buffer:
+		// php_end_ob_buffer(1, 1);
+		php_output_flush();
+
+	Flushing all output buffers:
+		// not possible with old API
+		php_output_flush_all();
+
+	Cleaning one output buffer:
+		// php_ob_end_buffer(0, 1);
+		php_output_clean();
+
+	Cleaning all output buffers:
+		// not possible with old API
+		php_output_clean_all();
+
+	Discarding one output buffer:
+		// php_ob_end_buffer(0, 0);
+		php_output_discard();
+
+	Discarding all output buffers:
+		// php_ob_end_buffers(0);
+		php_output_discard_all();
+
+	Stopping (and dropping) one output buffer:
+		// php_ob_end_buffer(1, 0)
+		php_output_end();
+
+	Stopping (and dropping) all output buffers:
+		// php_ob_end_buffers(1, 0);
+		php_output_end_all();
+
+	Retrieving output buffers contents:
+		// php_ob_get_buffer(zstring);
+		php_output_get_contents(zstring);
+
+	Retrieving output buffers length:
+		// php_ob_get_length(zlength);
+		php_output_get_length(zlength);
+
+	Retrieving output buffering level:
+		// OG(nesting_level);
+		php_output_get_level();
+
+	Issue a warning because of an output handler conflict:
+		// php_ob_init_conflict("to be started handler name", "to be tested if already started handler name");
+		php_output_handler_conflict(new_handler_name, new_handler_name_len, set_handler_name, set_handler_name_len);
+
+	Registering a conflict checking function, which will be checked prior starting the handler:
+		// not possible with old API, unless hardcoding into output.c
+		php_output_handler_conflict_register(handler_name, handler_name_len, my_php_output_handler_conflict_check_t);
+
+	Registering a reverse conflict checking function, which will be checked prior starting the specified foreign handler:
+		// not possible with old API
+		php_output_handler_reverse_conflict_register(foreign_handler_name, foreign_handler_name_len, my_php_output_handler_conflict_check_t);
+
+	Facilitating a context from within an output handler callable with ob_start():
+		// not possible with old API
+		php_output_handler_hook(PHP_OUTPUT_HANDLER_HOOK_GET_OPAQ, (void *) &custom_ctx_ptr_ptr);
+
+	Disabling of the output handler by itself:
+		//not possible with old API
+		php_output_handler_hook(PHP_OUTPUT_HANDLER_HOOK_DISABLE, NULL);
+
+	Marking an output handler immutable by itself because of irreversibility of its operation:
+		// not possible with old API
+		php_output_handler_hook(PHP_OUTPUT_HANDLER_HOOK_IMMUTABLE, NULL);
+
+	Restarting the output handler because of a CLEAN operation:
+		// not possible with old API
+		if (flags & PHP_OUTPUT_HANDLER_CLEAN) { ... }
+
+	Recognizing by the output handler itself if it gets discarded:
+		// not possible with old API
+		if ((flags & PHP_OUTPUT_HANDLER_CLEAN) && (flags & PHP_OUTPUT_HANDLER_FINAL)) { ... }
+
+
+Output handler hooks
+
+	The output handler can change its abilities at runtime. Eg. the gz handler can
+	remove the CLEANABLE and REMOVABLE bits when the first output has passed through it;
+	or handlers implemented in C to be used with ob_start() can contain a non-global
+	context:
+		PHP_OUTPUT_HANDLER_HOOK_GET_OPAQ
+			pass a void*** pointer as second arg to receive the address of a pointer
+			pointer to the opaque field of the output handler context
+		PHP_OUTPUT_HANDLER_HOOK_GET_FLAGS
+			pass a int* pointer as second arg to receive the flags set for the output handler
+		PHP_OUTPUT_HANDLER_HOOK_GET_LEVEL
+			pass a int* pointer as second arg to receive the level of this output handler
+			(starts with 0)
+		PHP_OUTPUT_HANDLER_HOOK_IMMUTABLE
+			the second arg is ignored; marks the output handler to be neither cleanable
+			nor removable
+		PHP_OUTPUT_HANDLER_HOOK_DISABLE
+			the second arg is ignored; marks the output handler as disabled
+
+
+Open questions
+
+	Should the userland API be adjusted and unified?
+
+	Many bits of the manual (and very first implementation) do not comply
+	with the behaviour of the current (to be obsoleted) code, thus should
+	the manual or the behaviour be adjusted?
+
+END

+ 235 - 0
EVSE/GPL/php-7.3.28/README.PARAMETER_PARSING_API

@@ -0,0 +1,235 @@
+New parameter parsing functions
+===============================
+
+It should be easier to parse input parameters to an extension function.
+Hence, borrowing from Python's example, there are now a set of functions
+that given the string of type specifiers, can parse the input parameters
+and store the results in the user specified variables. This avoids most
+of the IS_* checks and convert_to_* conversions. The functions also
+check for the appropriate number of parameters, and try to output
+meaningful error messages.
+
+
+Prototypes
+----------
+/* Implemented. */
+int zend_parse_parameters(int num_args, char *type_spec, ...);
+int zend_parse_parameters_ex(int flags, int num_args, char *type_spec, ...);
+
+The zend_parse_parameters() function takes the number of parameters
+passed to the extension function, the type specifier string, and the
+list of pointers to variables to store the results in. The _ex() version
+also takes 'flags' argument -- current only ZEND_PARSE_PARAMS_QUIET can
+be used as 'flags' to specify that the function should operate quietly
+and not output any error messages.
+
+Both functions return SUCCESS or FAILURE depending on the result.
+
+The auto-conversions are performed as necessary. Arrays, objects, and
+resources cannot be auto-converted.
+
+PHP 5.3 includes a new function (actually implemented as macro):
+
+int zend_parse_parameters_none();
+
+This returns SUCCESS if no argument has been passed to the function,
+FAILURE otherwise.
+
+PHP 5.5 includes a new function:
+
+int zend_parse_parameter(int flags, int arg_num, zval **arg, const char *spec, ...);
+
+This function behaves like zend_parse_parameters_ex() except that instead of
+reading the arguments from the stack, it receives a single zval to convert
+(passed with double indirection). The passed zval may be changed in place as
+part of the conversion process.
+
+See also https://wiki.php.net/rfc/zpp_improv#expose_zend_parse_arg_as_zend_parse_parameter
+
+
+Type specifiers
+---------------
+ The following list shows the type specifier, its meaning and the parameter
+ types that need to be passed by address. All passed parameters are set
+ if the PHP parameter is non optional and untouched if optional and the
+ parameter is not present. The only exception is O where the zend_class_entry*
+ has to be provided on input and is used to verify the PHP parameter is an
+ instance of that class.
+
+ a  - array (zval*)
+ A  - array or object (zval*)
+ b  - boolean (zend_bool)
+ C  - class (zend_class_entry*)
+ d  - double (double)
+ f  - function or array containing php method call info (returned as
+      zend_fcall_info and zend_fcall_info_cache)
+ h  - array (returned as HashTable*)
+ H  - array or HASH_OF(object) (returned as HashTable*)
+ l  - long (zend_long)
+ L  - long, limits out-of-range numbers to LONG_MAX/LONG_MIN (zend_long, ZEND_LONG_MAX/ZEND_LONG_MIN)
+ o  - object of any type (zval*)
+ O  - object of specific type given by class entry (zval*, zend_class_entry)
+ p  - valid path (string without null bytes in the middle) and its length (char*, size_t)
+ P  - valid path (string without null bytes in the middle) as zend_string (zend_string*)
+ r  - resource (zval*)
+ s  - string (with possible null bytes) and its length (char*, size_t)
+ S  - string (with possible null bytes) as zend_string (zend_string*)
+ z  - the actual zval (zval*)
+ *  - variable arguments list (0 or more)
+ +  - variable arguments list (1 or more)
+
+ The following characters also have a meaning in the specifier string:
+    | - indicates that the remaining parameters are optional, they
+        should be initialized to default values by the extension since they
+        will not be touched by the parsing function if they are not
+        passed to it.
+    / - use SEPARATE_ZVAL_IF_NOT_REF() on the parameter it follows
+    ! - the parameter it follows can be of specified type or NULL. If NULL is
+		passed and the output for such type is a pointer, then the output
+		pointer is set to a native NULL pointer.
+		For 'b', 'l' and 'd', an extra argument of type zend_bool* must be
+		passed after the corresponding bool*, zend_long* or double* arguments,
+		respectively. A non-zero value will be written to the zend_bool if a
+		PHP NULL is passed.
+
+
+Note on 64bit compatibility
+---------------------------
+Please note that since version 7 PHP uses zend_long as integer type and
+zend_string with size_t as length, so make sure you pass zend_longs to "l"
+and size_t to strings length (i.e. for "s" you need to pass char * and size_t),
+not the other way round!
+
+Both mistakes might cause memory corruptions and segfaults:
+1)
+  char *str;
+  long str_len; /* XXX THIS IS WRONG!! Use size_t instead. */
+  zend_parse_parameters(ZEND_NUM_ARGS(), "s", &str, &str_len)
+
+2)
+  int num; /* XXX THIS IS WRONG!! Use zend_long instead. */
+  zend_parse_parameters(ZEND_NUM_ARGS(), "l", &num)
+
+If you're in doubt, use check_parameters.php script to the parameters
+and their types (it can be found in ./scripts/dev/ directory of PHP sources):
+
+# php ./scripts/dev/check_parameters.php /path/to/your/sources/
+
+
+Examples
+--------
+/* Gets a long, a string and its length, and a zval */
+zend_long l;
+char *s;
+size_t s_len;
+zval *param;
+if (zend_parse_parameters(ZEND_NUM_ARGS(), "lsz",
+                          &l, &s, &s_len, &param) == FAILURE) {
+    return;
+}
+
+
+/* Gets an object of class specified by my_ce, and an optional double. */
+zval *obj;
+double d = 0.5;
+zend_class_entry *my_ce;
+if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|d",
+                          &obj, my_ce, &d) == FAILURE) {
+    return;
+}
+
+
+/* Gets an object or null, and an array.
+   If null is passed for object, obj will be set to NULL. */
+zval *obj;
+zval *arr;
+if (zend_parse_parameters(ZEND_NUM_ARGS(), "o!a",
+                          &obj, &arr) == FAILURE) {
+    return;
+}
+
+
+/* Gets a separated array which can also be null. */
+zval *arr;
+if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/!",
+                          &arr) == FAILURE) {
+    return;
+}
+
+/* Get either a set of 3 longs or a string. */
+zend_long l1, l2, l3;
+char *s;
+/*
+ * The function expects a pointer to a size_t in this case, not a long
+ * or any other type.  If you specify a type which is larger
+ * than a 'size_t', the upper bits might not be initialized
+ * properly, leading to random crashes on platforms like
+ * Tru64 or Linux/Alpha.
+ */
+size_t length;
+
+if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(),
+                             "lll", &l1, &l2, &l3) == SUCCESS) {
+    /* manipulate longs */
+} else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(),
+                                    "s", &s, &length) == SUCCESS) {
+    /* manipulate string */
+} else {
+    /* output error */
+
+    return;
+}
+
+
+/* Function that accepts only varargs (0 or more) */
+
+int i, num_varargs;
+zval *varargs = NULL;
+
+
+if (zend_parse_parameters(ZEND_NUM_ARGS(), "*", &varargs, &num_varargs) == FAILURE) {
+    return;
+}
+
+for (i = 0; i < num_varargs; i++) {
+    /* do something with varargs[i] */
+}
+
+if (varargs) {
+    efree(varargs);
+}
+
+
+/* Function that accepts a string, followed by varargs (1 or more) */
+
+char *str;
+size_t str_len;
+int i, num_varargs;
+zval *varargs = NULL;
+
+if (zend_parse_parameters(ZEND_NUM_ARGS(), "s+", &str, &str_len, &varargs, &num_varargs) == FAILURE) {
+    return;
+}
+
+for (i = 0; i < num_varargs; i++) {
+    /* do something with varargs[i] */
+}
+
+/* Function that takes an array, followed by varargs, and ending with a long */
+zend_long num;
+zval *array;
+int i, num_varargs;
+zval *varargs = NULL;
+
+if (zend_parse_parameters(ZEND_NUM_ARGS(), "a*l", &array, &varargs, &num_varargs, &num) == FAILURE) {
+    return;
+}
+
+for (i = 0; i < num_varargs; i++) {
+    /* do something with varargs[i] */
+}
+
+/* Function that doesn't accept any arguments */
+if (zend_parse_parameters_none() == FAILURE) {
+    return;
+}

+ 545 - 0
EVSE/GPL/php-7.3.28/README.REDIST.BINS

@@ -0,0 +1,545 @@
+1. libmagic (ext/fileinfo) see ext/fileinfo/libmagic/LICENSE
+2. Oniguruma (ext/mbstring) see ext/mbstring/oniguruma/COPYING
+3. libmbfl (ext/mbstring) see ext/mbstring/libmbfl/LICENSE
+4. pcre2lib (ext/pcre)
+5. ext/standard crypt
+6. ext/standard crypt's blowfish implementation
+7. Sqlite/Sqlite3 ext/sqlite3 ext/sqlite
+8. ext/standard/rand
+9. ext/standard/scanf
+10. ext/standard/strnatcmp.c
+11. ext/standard/uuencode
+12. libxmlrpc ext/xmlrpc
+13. libzip ext/zip
+14. main/snprintf.c
+15. main/strlcat
+16. main/strlcpy
+17. libgd see ext/gd/libgd/COPYING
+18. ext/phar portions of tar implementations
+19. libbcmath (ext/bcmath) see ext/bcmath/libbcmath/COPYING.LIB
+
+
+4. pcre2lib (ext/pcre)
+
+PCRE2 LICENCE
+-------------
+
+PCRE2 is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+Release 10 of PCRE2 is distributed under the terms of the "BSD" licence, as
+specified below, with one exemption for certain binary redistributions. The
+documentation for PCRE2, supplied in the "doc" directory, is distributed under
+the same terms as the software itself. The data in the testdata directory is
+not copyrighted and is in the public domain.
+
+The basic library functions are written in C and are freestanding. Also
+included in the distribution is a just-in-time compiler that can be used to
+optimize pattern matching. This is an optional feature that can be omitted when
+the library is built.
+
+
+THE BASIC LIBRARY FUNCTIONS
+---------------------------
+
+Written by:       Philip Hazel
+Email local part: ph10
+Email domain:     cam.ac.uk
+
+University of Cambridge Computing Service,
+Cambridge, England.
+
+Copyright (c) 1997-2018 University of Cambridge
+All rights reserved.
+
+
+PCRE2 JUST-IN-TIME COMPILATION SUPPORT
+--------------------------------------
+
+Written by:       Zoltan Herczeg
+Email local part: hzmester
+Emain domain:     freemail.hu
+
+Copyright(c) 2010-2018 Zoltan Herczeg
+All rights reserved.
+
+
+STACK-LESS JUST-IN-TIME COMPILER
+--------------------------------
+
+Written by:       Zoltan Herczeg
+Email local part: hzmester
+Emain domain:     freemail.hu
+
+Copyright(c) 2009-2018 Zoltan Herczeg
+All rights reserved.
+
+
+THE "BSD" LICENCE
+-----------------
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notices,
+      this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above copyright
+      notices, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the name of the University of Cambridge nor the names of any
+      contributors may be used to endorse or promote products derived from this
+      software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+
+EXEMPTION FOR BINARY LIBRARY-LIKE PACKAGES
+------------------------------------------
+
+The second condition in the BSD licence (covering binary redistributions) does
+not apply all the way down a chain of software. If binary package A includes
+PCRE2, it must respect the condition, but if package B is software that
+includes package A, the condition is not imposed on package B unless it uses
+PCRE2 independently.
+
+End
+
+
+5. ext/standard crypt
+
+FreeSec: libcrypt for NetBSD
+
+Copyright (c) 1994 David Burren
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+	 notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+	 notice, this list of conditions and the following disclaimer in the
+	 documentation and/or other materials provided with the distribution.
+3. Neither the name of the author nor the names of other contributors
+	 may be used to endorse or promote products derived from this software
+	 without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+
+6. ext/standard crypt's blowfish implementation
+
+The crypt_blowfish homepage is:
+
+http://www.openwall.com/crypt/
+
+This code comes from John the Ripper password cracker, with reentrant
+and crypt(3) interfaces added, but optimizations specific to password
+cracking removed.
+
+Written by Solar Designer <solar at openwall.com> in 1998-2011.
+No copyright is claimed, and the software is hereby placed in the public
+domain. In case this attempt to disclaim copyright and place the software
+in the public domain is deemed null and void, then the software is
+Copyright (c) 1998-2011 Solar Designer and it is hereby released to the
+general public under the following terms:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted.
+
+There's ABSOLUTELY NO WARRANTY, express or implied.
+
+It is my intent that you should be able to use this on your system,
+as part of a software package, or anywhere else to improve security,
+ensure compatibility, or for any other purpose. I would appreciate
+it if you give credit where it is due and keep your modifications in
+the public domain as well, but I don't require that in order to let
+you place this code and any modifications you make under a license
+of your choice.
+
+This implementation is mostly compatible with OpenBSD's bcrypt.c (prefix
+"$2a$") by Niels Provos <provos at citi.umich.edu>, and uses some of his
+ideas. The password hashing algorithm was designed by David Mazieres
+<dm at lcs.mit.edu>. For more information on the level of compatibility,
+please refer to the comments in BF_set_key() and to the crypt(3) man page
+included in the crypt_blowfish tarball.
+
+There's a paper on the algorithm that explains its design decisions:
+
+http://www.usenix.org/events/usenix99/provos.html
+
+Some of the tricks in BF_ROUND might be inspired by Eric Young's
+Blowfish library (I can't be sure if I would think of something if I
+hadn't seen his code).
+
+
+7. Sqlite/Sqlite3 ext/sqlite3 ext/sqlite
+
+The author disclaims copyright to this source code.  In place of
+a legal notice, here is a blessing:
+  May you do good and not evil.
+  May you find forgiveness for yourself and forgive others.
+  May you share freely, never taking more than you give.
+
+
+8. ext/standard/rand
+The following php_mt_...() functions are based on a C++ class MTRand by
+Richard J. Wagner. For more information see the web page at
+http://www-personal.engin.umich.edu/~wagnerr/MersenneTwister.html
+
+Mersenne Twister random number generator -- a C++ class MTRand
+Based on code by Makoto Matsumoto, Takuji Nishimura, and Shawn Cokus
+Richard J. Wagner  v1.0  15 May 2003  rjwagner@writeme.com
+
+The Mersenne Twister is an algorithm for generating random numbers.  It
+was designed with consideration of the flaws in various other generators.
+The period, 2^19937-1, and the order of equidistribution, 623 dimensions,
+are far greater.  The generator is also fast; it avoids multiplication and
+division, and it benefits from caches and pipelines.  For more information
+see the inventors' web page at http://www.math.keio.ac.jp/~matumoto/emt.html
+
+Reference
+M. Matsumoto and T. Nishimura, "Mersenne Twister: A 623-Dimensionally
+Equidistributed Uniform Pseudo-Random Number Generator", ACM Transactions on
+Modeling and Computer Simulation, Vol. 8, No. 1, January 1998, pp 3-30.
+
+Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
+Copyright (C) 2000 - 2003, Richard J. Wagner
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+	 notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+	 notice, this list of conditions and the following disclaimer in the
+	 documentation and/or other materials provided with the distribution.
+
+3. The names of its contributors may not be used to endorse or promote
+	 products derived from this software without specific prior written
+	 permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+9. ext/standard/scanf
+scanf.c --
+
+This file contains the base code which implements sscanf and by extension
+fscanf. Original code is from TCL8.3.0 and bears the following copyright:
+
+This software is copyrighted by the Regents of the University of
+California, Sun Microsystems, Inc., Scriptics Corporation,
+and other parties.  The following terms apply to all files associated
+with the software unless explicitly disclaimed in individual files.
+
+The authors hereby grant permission to use, copy, modify, distribute,
+and license this software and its documentation for any purpose, provided
+that existing copyright notices are retained in all copies and that this
+notice is included verbatim in any distributions. No written agreement,
+license, or royalty fee is required for any of the authorized uses.
+Modifications to this software may be copyrighted by their authors
+and need not follow the licensing terms described here, provided that
+the new terms are clearly indicated on the first page of each file where
+they apply.
+
+IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.  THIS SOFTWARE
+IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+MODIFICATIONS.
+
+GOVERNMENT USE: If you are acquiring this software on behalf of the
+U.S. government, the Government shall have only "Restricted Rights"
+in the software and related documentation as defined in the Federal
+Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2).  If you
+are acquiring the software on behalf of the Department of Defense, the
+software shall be classified as "Commercial Computer Software" and the
+Government shall have only "Restricted Rights" as defined in Clause
+252.227-7013 (c) (1) of DFARs.  Notwithstanding the foregoing, the
+authors grant the U.S. Government and others acting in its behalf
+permission to use and distribute the software in accordance with the
+terms specified in this license.
+
+10. ext/standard/strnatcmp.c
+
+strnatcmp.c -- Perform 'natural order' comparisons of strings in C.
+Copyright (C) 2000 by Martin Pool <mbp@humbug.org.au>
+
+This software is provided 'as-is', without any express or implied
+warranty.  In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+	 claim that you wrote the original software. If you use this software
+	 in a product, an acknowledgment in the product documentation would be
+	 appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+	 misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+11. ext/standard/uuencode
+Portions of this code are based on Berkeley's uuencode/uudecode
+implementation.
+
+Copyright (c) 1983, 1993
+The Regents of the University of California.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+	notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+	notice, this list of conditions and the following disclaimer in the
+	documentation and/or other materials provided with the distribution.
+3. All advertising materials mentioning features or use of this software
+	must display the following acknowledgement:
+This product includes software developed by the University of
+California, Berkeley and its contributors.
+4. Neither the name of the University nor the names of its contributors
+	may be used to endorse or promote products derived from this software
+	without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+
+12. libxmlrpc ext/xmlrpc
+
+Copyright 2000 Epinions, Inc.
+
+Subject to the following 3 conditions, Epinions, Inc.  permits you, free
+of charge, to (a) use, copy, distribute, modify, perform and display this
+software and associated documentation files (the "Software"), and (b)
+permit others to whom the Software is furnished to do so as well.
+
+1) The above copyright notice and this permission notice shall be included
+without modification in all copies or substantial portions of the
+Software.
+
+2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF
+ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY
+IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE OR NONINFRINGEMENT.
+
+3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT,
+SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
+OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING
+NEGLIGENCE), EVEN IF EPINIONS, INC.  IS AWARE OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+13. libzip ext/zip
+zip.h -- exported declarations.
+Copyright (C) 1999-2009 Dieter Baron and Thomas Klausner
+
+This file is part of libzip, a library to manipulate ZIP archives.
+The authors can be contacted at <libzip@nih.at>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+	 notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+	 notice, this list of conditions and the following disclaimer in
+	 the documentation and/or other materials provided with the
+	 distribution.
+3. The names of the authors may not be used to endorse or promote
+	 products derived from this software without specific prior
+	 written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+14. main/snprintf.c
+Copyright (c) 2002, 2006 Todd C. Miller <Todd.Miller@courtesan.com>
+
+Permission to use, copy, modify, and distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Sponsored in part by the Defense Advanced Research Projects
+Agency (DARPA) and Air Force Research Laboratory, Air Force
+Materiel Command, USAF, under agreement number F39502-99-1-0512.
+
+main/spprintf
+Copyright (c) 1995-1998 The Apache Group.  All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+	 notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+	 notice, this list of conditions and the following disclaimer in
+	 the documentation and/or other materials provided with the
+	 distribution.
+
+3. All advertising materials mentioning features or use of this
+	 software must display the following acknowledgment:
+	 "This product includes software developed by the Apache Group
+	 for use in the Apache HTTP server project (http://www.apache.org/)."
+
+4. The names "Apache Server" and "Apache Group" must not be used to
+	 endorse or promote products derived from this software without
+	 prior written permission.
+
+5. Redistributions of any form whatsoever must retain the following
+	 acknowledgment:
+	 "This product includes software developed by the Apache Group
+	 for use in the Apache HTTP server project (http://www.apache.org/)."
+
+THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
+EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
+ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+OF THE POSSIBILITY OF SUCH DAMAGE.
+====================================================================
+
+This software consists of voluntary contributions made by many
+individuals on behalf of the Apache Group and was originally based
+on public domain software written at the National Center for
+Supercomputing Applications, University of Illinois, Urbana-Champaign.
+For more information on the Apache Group and the Apache HTTP server
+project, please see <http://www.apache.org/>.
+
+This code is based on, and used with the permission of, the
+SIO stdio-replacement strx_* functions by Panos Tsirigotis
+<panos@alumni.cs.colorado.edu> for xinetd.
+
+15. main/strlcat
+16. main/strlcpy
+Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+	notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+	notice, this list of conditions and the following disclaimer in the
+	documentation and/or other materials provided with the distribution.
+3. The name of the author may not be used to endorse or promote products
+	derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
+THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+18. ext/phar portions of tar implementations
+
+portions of tar implementations in ext/phar - phar_tar_octal() are based on an
+implementation by Tim Kientzle from libarchive, licensed with this license:
+
+ Copyright (c) 2003-2007 Tim Kientzle
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ 372 - 0
EVSE/GPL/php-7.3.28/README.RELEASE_PROCESS

@@ -0,0 +1,372 @@
+=======================
+  PHP Release Process
+=======================
+
+General notes and tips
+----------------------
+
+1. Do not release on Fridays, Saturdays or Sundays
+because the sysadmins can not upgrade stuff then.
+
+2. Package two days before a release. So if the release is to be on Thursday,
+package on Tuesday. Think about timezones as well.
+
+3. Ensure that the tests on Travis CI are green.
+See: https://travis-ci.org/php/php-src/builds
+It is recommended to do so a couple of days before the packaging day, to
+have enough time to investigate failures, communicate with the authors and
+commit the fixes.
+The RM for the branch is also responsible for keeping the CI green on
+ongoing basis between the releases. Check the CI status for your branch
+periodically and resolve the failures ASAP. See more in:
+https://wiki.php.net/rfc/travis_ci
+
+4. Ensure that Windows builds will work before packaging
+
+5. Follow all steps to the letter. When unclear ask previous RM's (David/Julien/
+Johannes/Stas/Derick/Ilia) before proceeding. Ideally make sure that for the
+first releases one of the previous RM's is around to answer questions. For the
+steps related to the php/QA/bug websites try to have someone from the webmaster
+team (Bjori) on hand.
+
+6. Verify the tags to be extra sure everything was tagged properly.
+
+7. Moving extensions from/to PECL requires write access to the destination.
+Most developers should have this.
+
+Moving extensions from php-src to PECL
+- Checkout the pecl directory, most likely you want a sparse-root checkout
+  svn co --depth=empty https://svn.php.net/repository/pecl
+- Create a directory for the extension incl. branch and tag structure,
+  no trunk at this point and commit this to svn
+  cd pecl; mkdir foo foo/tags foo/branches; svn add foo; svn commit
+- Move the extension from php-src to the new location
+  svn mv https://svn.php.net/repository/php/php-src/trunk/ext/foo \
+         https://svn.php.net/repository/pecl/foo/trunk
+
+If the extension is still usable or not dead, in cooperation with the extension
+maintainers if any:
+- create the pecl.php.net/foo package and its content, license, maintainer
+- create the package.xml, commit
+- release the package
+
+For Moving extensions from PECL to php-src the svn mv has to be done the other
+way round.
+
+Rolling a non stable release (alpha/beta/RC)
+--------------------------------------------
+
+1. Check windows snapshot builder logs (http://windows.php.net/downloads/snaps/ the last revision)
+
+2. Check the tests at https://travis-ci.org/php/php-src/builds
+
+3. run the "scripts/dev/credits" script in php-src and commit the changes in the
+credits files in ext/standard.
+
+4. Checkout the release branch for this release (e.g., PHP-5.4.2) from the main branch.
+
+5. Bump the version numbers in ``main/php_version.h``, ``configure.ac`` and possibly ``NEWS``.
+Do not use abbreviations for alpha and beta. Do not use dashes, you should
+``#define PHP_VERSION "5.4.22RC1"`` and not ``#define PHP_VERSION "5.4.22-RC1"``
+
+6. Compile and make test, with and without ZTS, using the right Bison version
+(for example, for 5.5, Bison 2.4.1 is used)
+
+7. Check ./sapi/cli/php -v output for version matching.
+
+8. If all is right, commit the changes to the release branch with ``git commit -a``.
+
+9. Tag the repository release branch with the version, e.g.:
+``git tag -u YOURKEYID php-5.4.2RC2``
+
+10. Bump the version numbers in ``main/php_version.h``, ``configure.ac`` and ``NEWS``
+in the *main* branch (PHP-5.4 for example) to prepare for the **next** version.
+F.e. if the RC is "5.4.1RC1" then the new one should be "5.4.2-dev" - regardless if we get
+a new RC or not. This is to make sure ``version_compare()`` can correctly work.
+Commit the changes to the main branch.
+
+11. Push the changes to the main repo, the tag, the main branch and the release branch :
+``git push --tags origin HEAD``
+``git push origin {main branch}``
+``git push origin {release branch}``
+
+12. run: ``PHPROOT=. ./makedist 5.4.2RC2``, this will export the tree, create configure
+and build three tarballs (gz, bz2 and xz).
+
+13. run ``scripts/dev/gen_verify_stub <version> [identity]``, this will sign the tarballs
+and output verification information to be included in announcement email
+
+14. Copy those tarballs (scp, rsync) to downloads.php.net, in your homedir there should be a
+directory "public_html/". Copy them into there, so that the system can generate
+MD5 sums. If you do not have this directory, create it.
+
+15. Now the RC can be found on http://downloads.php.net/~yourname,
+f.e. http://downloads.php.net/~derick/
+
+16. Once the release has been tagged, contact the release-managers@ distribution list
+so that Windows binaries can be created.  Once those are made, they can be found at
+http://windows.php.net/download
+
+Getting the non stable release (alpha/beta/RC) announced
+--------------------------------------------------------
+
+1. Update ``qa.git/include/release-qa.php`` with the appropriate information.
+   See the documentation within release-qa.php for more information, but all releases
+   and RCs are configured here. Only $QA_RELEASES needs to be edited.
+
+   Example: When rolling an RC, set the 'rc' with appropriate information for the
+   given version.
+
+   Note: Remember to update the MD5 and sha256 checksum information.
+
+2. Update ``web/php.git/include/version.inc`` (x=major version number)
+
+ a. ``$PHP_x_RC`` = "5.4.0RC1"  (should be set to "false" before)
+
+ b. ``$PHP_x_RC_DATE`` = "06 September 2007"
+
+3. Add a short notice to phpweb stating that there is a new release, and
+highlight the major important things (security fixes) and when it is important
+to upgrade.
+
+ a. Call php bin/createNewsEntry in your local phpweb checkout
+    Use category "releases" for all stable releases.
+    Use category "frontpage" for X.Y.0 non-stable releases only (news only).
+
+ b. Add the content for the news entry. Be sure to include the text:
+    "THIS IS A DEVELOPMENT PREVIEW - DO NOT USE IT IN PRODUCTION!"
+
+4. Commit and push changes to qa and web
+
+*Wait for web and qa sites to update with new information before sending announce*
+
+5. Send **separate** emails **To** ``internals@lists.php.net`` and ``php-general@lists.php.net``
+lists pointing out "the location of the release" and "the possible release date of
+either the next RC, or the final release". Include in this information the verification
+information output by ``gen_verify_stub``.
+
+6. Send **separate** emails (see example here http://news.php.net/php.pear.qa/5201) **To**
+``php-qa@lists.php.net`` and ``primary-qa-tester@lists.php.net``.
+These emails are to notify the selected projects about a new release so that they
+can make sure their projects keep working. Make sure that you have been setup
+as a moderator for ``primary-qa-tester@lists.php.net`` by having someone (Hannes, Dan,
+Derick) run the following commands for you:
+
+``ssh lists.php.net``
+
+``sudo -u ezmlm ezmlm-sub ~ezmlm/primary-qa-tester/mod moderator-email-address``
+
+Rolling a stable release
+------------------------
+
+1. Checkout your release branch, you should have created when releasing previous RC
+and bump the version numbers in ``main/php_version.h``, ``configure.ac`` and possibly ``NEWS``.
+
+2. If a CVE commit needs to be merged to the release, then have it committed to
+the base branches and merged upwards as usual (f.e commit the CVE fix to 5.3,
+merge to 5.4, 5.5 etc...). Then you can cherry-pick it in your release branch.
+Don't forget to update NEWS manually in an extra commit then.
+
+3. Commit those changes. Ensure the tests at https://travis-ci.org/php/php-src/builds are
+still passing.
+
+4. run the "scripts/dev/credits" script in php-src and commit the changes in the
+credits files in ext/standard.
+
+5. Compile and make test, with and without ZTS, using the right Bison version
+(for example, for 5.5, Bison 2.4.1 is used)
+
+6. Check ./sapi/cli/php -v output for version matching.
+
+7. tag the repository with the version f.e. "``git tag -u YOURKEYID -s php-5.4.1``"
+
+8. Push the tag f.e. "``git push origin php-5.4.1``"
+
+9. run: ``PHPROOT=. ./makedist php 5.4.1``, this will export the tag, create configure
+and build three tarballs (gz, bz2 and xz).
+   Check if the pear files are updated (phar).
+   On some systems the behavior of GNU tar can default to produce POSIX compliant archives
+with PAX headers. As not every application is compatible with that format, creation of
+archives with PAX headers should be avoided. When packaging on such a system, the GNU tar
+can be influenced by defining the environment variable TAR_OPTIONS='--format=gnu'.
+
+10. Generate the GPG signature files for the archives.
+  ``gpg -u YOUREMAIL --armor --detach-sign php-X.Y.Z.tar.xxx``
+
+11. Commit and push all the tarballs and signature files to web/php-distributions.git,
+    then update the git submodule reference in web/php.git:
+    ``git submodule init;
+    git submodule update;
+    cd distributions;
+    git fetch;
+    git pull --rebase origin master;
+    cd ..;
+    git commit distributions;
+    git push;``
+This is to fetch the last commit id from php-distributions.git and commit this
+last commit id to web/php.git, then, mirrors will now sync
+
+12. Once the release has been tagged, contact release managers, windows builders, and package maintainers
+so that they can build releases. Do not send this announcement to any public lists.
+
+Getting the stable release announced
+------------------------------------
+
+1. Update phpweb/include/releases.inc with the old release info
+  (updates the download archives)
+
+ a. You can run ``php bin/bumpRelease 5`` if you are making a release for the
+    highest branch, otherwise you have to do this manually, see point 1.b
+
+ b. In case multiple PHP minor versions are in active development you have
+    to manually copy the old information to include/releases.inc
+
+2. Edit ``phpweb/include/version.inc`` and change (X=major release number):
+
+ a. ``$PHP_X_VERSION`` to the correct version
+
+ b. ``$PHP_X_DATE`` to the release date
+
+ c. ``$PHP_X_MD5`` array and update all the md5 sums
+
+ d. ``$PHP_X_SHA256`` array and update all the SHA256 sums
+
+ e. set ``$PHP_X_RC`` to false!
+
+ f. Make sure there are no outdated "notes" or edited "date" keys in the
+ ``$RELEASES[X][$PHP_X_VERSION]["source"]`` array
+
+ g. if the windows builds aren't ready yet prefix the "windows" key with a dot (".windows")
+
+3. Create the release file (releases/x_y_z.php)
+   Usually we use the same content as for point 6, but included in php template
+   instead of the release xml.
+
+4. Update php-qa/include/release-qa.php and add the next version as an QARELEASE
+   (prepare for next RC)
+
+5. Update the ChangeLog file for the given major version
+f.e. ``ChangeLog-5.php`` from the NEWS file
+
+ a. go over the list and put every element on one line
+
+ b. check for &, < and > and escape them if necessary
+
+ c. remove all the names at the ends of lines
+
+ d. for marking up, you can do the following (with VI):
+
+  I. ``s/^- /<li>/``
+
+  II. ``s/$/<\/li>/``
+
+  III. ``s/Fixed bug #\([0-9]\+\)/<?php bugfix(\1); ?>/``
+
+  IV. ``s/Fixed PECL bug #\([0-9]\+\)/<?php peclbugfix(\1); ?>/``
+
+  V. ``s/FR #\([0-9]\+\)/FR <?php bugl(\1); ?>/``
+
+  e. You may want to try php-web/bin/news2html to automate this task
+
+6. Add a short notice to phpweb stating that there is a new release, and
+highlight the major important things (security fixes) and when it is important
+to upgrade.
+
+ a. Call php bin/createNewsEntry in your local phpweb checkout
+
+ b. Add the content for the news entry
+
+7. **Check mirrors have been synced before announcing or pushing news**
+  Try, f.e. http://www.php.net/get/php-5.5.1.tar.bz2/from/a/mirror
+  Try several mirrors, mirrors may update slowly (may take an hour)
+
+8. Commit all the changes to their respective git repos
+
+9. Please note down the sha256 and the PGP signature (.asc). These *must* be
+   included in the release mail.
+10. Wait an hour or two, then send a mail to php-announce@lists.php.net,
+php-general@lists.php.net and internals@lists.php.net with a text similar to
+http://news.php.net/php.internals/17222.
+Please make sure that the mail to php-announce@ is its own completely separate email.
+This is to make sure that replies to the announcement on php-general@ or internals@
+will not accidentally hit the php-announce@ mailinglist.
+
+Re-releasing the same version (or -pl)
+--------------------------------------
+
+1. Commit the new binaries to ``phpweb/distributions/``
+
+2. Edit ``phpweb/include/version.inc`` and change (X=major release number):
+
+ a. If only releasing for one OS, make sure you edit only those variables
+
+ b. ``$PHP_X_VERSION`` to the correct version
+
+ c. ``$PHP_X_DATE`` to the release date
+
+ d. ``$PHP_X_MD5`` array and update all the md5 sums
+
+ e. ``$PHP_X_SHA256`` array and update all the SHA256 sums
+
+ f. Make sure there are no outdated "notes" or edited "date" keys in the
+ ``$RELEASES[X][$PHP_X_VERSION]["source"]`` array
+
+3. Add a short notice to phpweb stating that there is a new release, and
+highlight the major important things (security fixes) and when it is important
+to upgrade.
+
+ a. Call php bin/createNewsEntry in your local phpweb checkout
+
+ b. Add the content for the news entry
+
+4. Commit all the changes (``include/version.inc``, ``archive/archive.xml``,
+``archive/entries/YYYY-MM-DD-N.xml``)
+
+5. Wait an hour or two, then send a mail to php-announce@lists.php.net,
+php-general@lists.php.net and internals@lists.php.net with a text similar to
+the news entry.
+Please make sure that the mail to php-announce@ is its own completely separate email.
+This is to make sure that replies to the announcement on php-general@ or internals@
+will not accidentally hit the php-announce@ mailinglist.
+
+Forking a new release branch
+----------------------------
+
+1. One week prior to cutting X.Y.0beta1, warn internals@ that your version's branch
+   is about to be cut, and that PHP-X.Y will be moving into feature freeze.
+   Try to be specific about when the branch will be cut.
+      Example: http://news.php.net/php.internals/99864
+
+2. Just prior to cutting X.Y.0beta1, create the new branch locally.
+   Add a commit on master after the branch point clearing the NEWS file, and updating
+     main/php_versions.h and Zend/zend.h to update versions.
+     Example: https://github.com/php/php-src/commit/5230541ef59e0637d5522293a7d099bf18ce6af3
+   Push the new branch and the commit just added to master.
+
+3. Immediately notify internals@ of the branch cut and advise the new merging order:
+     Example: http://news.php.net/php.internals/99903
+
+4. Update php-web:git.php and wiki.php.net/vcs/gitworkflow to reflect the new branch:
+     Example: https://github.com/php/web-php/commit/74bcad4c770d95f21b7fbeeedbd76d943bb83f23
+
+5. Notify nlopess@ to add PHP_X_Y tag to gcov.php.net
+
+New Release Manager Checklist
+-----------------------------
+
+1. Email systems@ to get setup for access to downloads.php.net and to be added to the
+   release-managers@ distribution list.
+
+2. Create a GPG key for your @php.net address and publish it by editing `include/gpg-keys.inc`
+   in the `web-php` repository, adding the output of `gpg --fingerprint "$USER@php.net"`. Let
+   one or more of the previous RMs sign your key. Publish your public key to pgp.mit.edu with:
+   `gpg --keyserver pgp.mit.edu --send-keys $KEYID`
+
+3. Request karma to edit main/php_version.h. Possibly karma for other restricted parts of
+   php-src might come in question.
+
+4. Request karma for web/qa.git and web/php.git for publishing release announcements.
+
+5. Request moderation access to announce@php.net and primary-qa-tester@lists.php.net lists, to
+   be able to moderate your release announcements. All the announcements should be sent from
+   the @php.net alias.

+ 166 - 0
EVSE/GPL/php-7.3.28/README.SELF-CONTAINED-EXTENSIONS

@@ -0,0 +1,166 @@
+HOW TO CREATE A SELF-CONTAINED PHP EXTENSION
+
+  A self-contained extension can be distributed independently of
+  the PHP source. To create such an extension, two things are
+  required:
+
+  - Configuration file (config.m4)
+  - Source code for your module
+
+  We will describe now how to create these and how to put things
+  together.
+
+PREPARING YOUR SYSTEM
+
+  While the result will run on any system, a developer's setup needs these
+  tools:
+
+    GNU autoconf
+    GNU automake
+    GNU libtool
+    GNU m4
+
+  All of these are available from
+
+    ftp://ftp.gnu.org/pub/gnu/
+
+CONVERTING AN EXISTING EXTENSION
+
+  Just to show you how easy it is to create a self-contained
+  extension, we will convert an embedded extension into a
+  self-contained one. Install PHP and execute the following
+  commands.
+
+     $ mkdir /tmp/newext
+     $ cd /tmp/newext
+
+  You now have an empty directory. We will copy the files from
+  the mysql extension:
+
+     $ cp -rp php-4.0.X/ext/mysql/* .
+
+  It is time to finish the module. Run:
+
+     $ phpize
+
+  You can now ship the contents of the directory - the extension
+  can live completely on its own.
+
+  The user instructions boil down to
+
+     $ ./configure \
+            [--with-php-config=/path/to/php-config] \
+            [--with-mysql=MYSQL-DIR]
+     $ make install
+
+  The MySQL module will either use the embedded MySQL client
+  library or the MySQL installation in MYSQL-DIR.
+
+
+DEFINING THE NEW EXTENSION
+
+  Our demo extension is called "foobar".
+
+  It consists of two source files "foo.c" and "bar.c"
+  (and any arbitrary amount of header files, but that is not
+  important here).
+
+  The demo extension does not reference any external
+  libraries (that is important, because the user does not
+  need to specify anything).
+
+
+  LTLIBRARY_SOURCES specifies the names of the sources files. You can
+  name an arbitrary number of source files here.
+
+CREATING THE M4 CONFIGURATION FILE
+
+  The m4 configuration can perform additional checks. For a
+  self-contained extension, you do not need more than a few
+  macro calls.
+
+------------------------------------------------------------------------------
+PHP_ARG_ENABLE(foobar,whether to enable foobar,
+[  --enable-foobar            Enable foobar])
+
+if test "$PHP_FOOBAR" != "no"; then
+  PHP_NEW_EXTENSION(foobar, foo.c bar.c, $ext_shared)
+fi
+------------------------------------------------------------------------------
+
+  PHP_ARG_ENABLE will automatically set the correct variables, so
+  that the extension will be enabled by PHP_NEW_EXTENSION in shared mode.
+
+  The first argument of PHP_NEW_EXTENSION describes the name of the
+  extension.  The second names the source-code files.  The third passes
+  $ext_shared which is set by PHP_ARG_ENABLE/WITH to PHP_NEW_EXTENSION.
+
+  Please use always PHP_ARG_ENABLE or PHP_ARG_WITH. Even if you do not
+  plan to distribute your module with PHP, these facilities allow you
+  to integrate your module easily into the main PHP module framework.
+
+CREATING SOURCE FILES
+
+  ext_skel can be of great help when creating the common code for all modules
+  in PHP for you and also writing basic function definitions and C code for
+  handling arguments passed to your functions. See README.EXT_SKEL for further
+  information.
+
+  As for the rest, you are currently alone here. There are a lot of existing
+  modules, use a simple module as a starting point and add your own code.
+
+
+CREATING THE SELF-CONTAINED EXTENSION
+
+  Put config.m4 and the source files into one directory. Then, run phpize
+  (this is installed during make install by PHP 4.0).
+
+  For example, if you configured PHP with --prefix=/php, you would run
+
+     $ /php/bin/phpize
+
+  This will automatically copy the necessary build files and create
+  configure from your config.m4.
+
+  And that's it. You now have a self-contained extension.
+
+INSTALLING A SELF-CONTAINED EXTENSION
+
+  An extension can be installed by running:
+
+     $ ./configure \
+            [--with-php-config=/path/to/php-config]
+     $ make install
+
+ADDING SHARED MODULE SUPPORT TO A MODULE
+
+  In order to be useful, a self-contained extension must be loadable
+  as a shared module. I will explain now how you can add shared module
+  support to an existing module called foo.
+
+  1. In config.m4, use PHP_ARG_WITH/PHP_ARG_ENABLE. Then you will
+     automatically be able to use --with-foo=shared[,..] or
+     --enable-foo=shared[,..].
+
+  2. In config.m4, use PHP_NEW_EXTENSION(foo,.., $ext_shared) to enable
+     building the extension.
+
+  3. Add the following lines to your C source file:
+
+        #ifdef COMPILE_DL_FOO
+        ZEND_GET_MODULE(foo)
+        #endif
+
+PECL SITE CONFORMITY
+
+  If you plan to release an extension to the PECL website, there are several
+  points to be regarded.
+
+ 1. Add LICENSE or COPYING to the package.xml
+
+ 2. The following should be defined in one of the extension header files
+
+        #define PHP_FOO_VERSION "1.2.3"
+
+    This macros has to be used within your foo_module_entry to indicate the
+    extension version.

+ 378 - 0
EVSE/GPL/php-7.3.28/README.STREAMS

@@ -0,0 +1,378 @@
+An Overview of the PHP Streams abstraction
+==========================================
+
+WARNING: some prototypes in this file are out of date.
+The information contained here is being integrated into
+the PHP manual - stay tuned...
+
+Please send comments to: Wez Furlong <wez@thebrainroom.com>
+
+Why Streams?
+============
+You may have noticed a shed-load of issock parameters flying around the PHP
+code; we don't want them - they are ugly and cumbersome and force you to
+special case sockets and files every time you need to work with a "user-level"
+PHP file pointer.
+Streams take care of that and present the PHP extension coder with an ANSI
+stdio-alike API that looks much nicer and can be extended to support non file
+based data sources.
+
+Using Streams
+=============
+Streams use a php_stream* parameter just as ANSI stdio (fread etc.) use a
+FILE* parameter.
+
+The main functions are:
+
+PHPAPI size_t php_stream_read(php_stream * stream, char * buf, size_t count);
+PHPAPI size_t php_stream_write(php_stream * stream, const char * buf, size_t
+        count);
+PHPAPI size_t php_stream_printf(php_stream * stream,
+        const char * fmt, ...);
+PHPAPI int php_stream_eof(php_stream * stream);
+PHPAPI int php_stream_getc(php_stream * stream);
+PHPAPI char *php_stream_gets(php_stream * stream, char *buf, size_t maxlen);
+PHPAPI int php_stream_close(php_stream * stream);
+PHPAPI int php_stream_flush(php_stream * stream);
+PHPAPI int php_stream_seek(php_stream * stream, off_t offset, int whence);
+PHPAPI off_t php_stream_tell(php_stream * stream);
+PHPAPI int php_stream_lock(php_stream * stream, int mode);
+
+These (should) behave in the same way as the ANSI stdio functions with similar
+names: fread, fwrite, fprintf, feof, fgetc, fgets, fclose, fflush, fseek, ftell, flock.
+
+Opening Streams
+===============
+In most cases, you should use this API:
+
+PHPAPI php_stream *php_stream_open_wrapper(const char *path, const char *mode,
+    int options, char **opened_path);
+
+Where:
+    path is the file or resource to open.
+    mode is the stdio compatible mode eg: "wb", "rb" etc.
+    options is a combination of the following values:
+        IGNORE_PATH  (default) - don't use include path to search for the file
+        USE_PATH        - use include path to search for the file
+        IGNORE_URL      - do not use plugin wrappers
+        REPORT_ERRORS   - show errors in a standard format if something
+                          goes wrong.
+        STREAM_MUST_SEEK - If you really need to be able to seek the stream
+                           and don't need to be able to write to the original
+                           file/URL, use this option to arrange for the stream
+                           to be copied (if needed) into a stream that can
+                           be seek()ed.
+
+    opened_path is used to return the path of the actual file opened,
+    but if you used STREAM_MUST_SEEK, may not be valid.  You are
+    responsible for efree()ing opened_path.  opened_path may be (and usually
+    is) NULL.
+
+If you need to open a specific stream, or convert standard resources into
+streams there are a range of functions to do this defined in php_streams.h.
+A brief list of the most commonly used functions:
+
+PHPAPI php_stream *php_stream_fopen_from_file(FILE *file, const char *mode);
+    Convert a FILE * into a stream.
+
+PHPAPI php_stream *php_stream_fopen_tmpfile(void);
+    Open a FILE * with tmpfile() and convert into a stream.
+
+PHPAPI php_stream *php_stream_fopen_temporary_file(const char *dir,
+    const char *pfx, char **opened_path);
+    Generate a temporary file name and open it.
+
+There are some network enabled relatives in php_network.h:
+
+PHPAPI php_stream *php_stream_sock_open_from_socket(int socket, int persistent);
+    Convert a socket into a stream.
+
+PHPAPI php_stream *php_stream_sock_open_host(const char *host, unsigned short port,
+		int socktype, int timeout, int persistent);
+    Open a connection to a host and return a stream.
+
+PHPAPI php_stream *php_stream_sock_open_unix(const char *path, int persistent,
+    struct timeval *timeout);
+    Open a UNIX domain socket.
+
+
+Stream Utilities
+================
+
+If you need to copy some data from one stream to another, you will be please
+to know that the streams API provides a standard way to do this:
+
+PHPAPI size_t php_stream_copy_to_stream(php_stream *src,
+    php_stream *dest, size_t maxlen);
+
+If you want to copy all remaining data from the src stream, pass
+PHP_STREAM_COPY_ALL as the maxlen parameter, otherwise maxlen indicates the
+number of bytes to copy.
+This function will try to use mmap where available to make the copying more
+efficient.
+
+If you want to read the contents of a stream into an allocated memory buffer,
+you should use:
+
+PHPAPI size_t php_stream_copy_to_mem(php_stream *src, char **buf,
+    size_t maxlen, int persistent);
+
+This function will set buf to the address of the buffer that it allocated,
+which will be maxlen bytes in length, or will be the entire length of the
+data remaining on the stream if you set maxlen to PHP_STREAM_COPY_ALL.
+The buffer is allocated using pemalloc(); you need to call pefree() to
+release the memory when you are done.
+As with copy_to_stream, this function will try use mmap where it can.
+
+If you have an existing stream and need to be able to seek() it, you
+can use this function to copy the contents into a new stream that can
+be seek()ed:
+
+PHPAPI int php_stream_make_seekable(php_stream *origstream, php_stream **newstream);
+
+It returns one of the following values:
+#define PHP_STREAM_UNCHANGED	0 /* orig stream was seekable anyway */
+#define PHP_STREAM_RELEASED		1 /* newstream should be used; origstream is no longer valid */
+#define PHP_STREAM_FAILED		2 /* an error occurred while attempting conversion */
+#define PHP_STREAM_CRITICAL		3 /* an error occurred; origstream is in an unknown state; you should close origstream */
+
+make_seekable will always set newstream to be the stream that is valid
+if the function succeeds.
+When you have finished, remember to close the stream.
+
+NOTE: If you only need to seek forward, there is no need to call this
+function, as the php_stream_seek can emulate forward seeking when the
+whence parameter is SEEK_CUR.
+
+NOTE: Writing to the stream may not affect the original source, so it
+only makes sense to use this for read-only use.
+
+NOTE: If the origstream is network based, this function will block
+until the whole contents have been downloaded.
+
+NOTE: Never call this function with an origstream that is referenced
+as a resource! It will close the origstream on success, and this
+can lead to a crash when the resource is later used/released.
+
+NOTE: If you are opening a stream and need it to be seekable, use the
+STREAM_MUST_SEEK option to php_stream_open_wrapper();
+
+PHPAPI int php_stream_supports_lock(php_stream * stream);
+
+This function will return either 1 (success) or 0 (failure) indicating whether or
+not a lock can be set on this stream. Typically you can only set locks on stdio streams.
+
+Casting Streams
+===============
+What if your extension needs to access the FILE* of a user level file pointer?
+You need to "cast" the stream into a FILE*, and this is how you do it:
+
+FILE * fp;
+php_stream * stream; /* already opened */
+
+if (php_stream_cast(stream, PHP_STREAM_AS_STDIO, (void*)&fp, REPORT_ERRORS) == FAILURE)    {
+    RETURN_FALSE;
+}
+
+The prototype is:
+
+PHPAPI int php_stream_cast(php_stream * stream, int castas, void ** ret, int
+        show_err);
+
+The show_err parameter, if non-zero, will cause the function to display an
+appropriate error message of type E_WARNING if the cast fails.
+
+castas can be one of the following values:
+PHP_STREAM_AS_STDIO - a stdio FILE*
+PHP_STREAM_AS_FD - a generic file descriptor
+PHP_STREAM_AS_SOCKETD - a socket descriptor
+
+If you ask a socket stream for a FILE*, the abstraction will use fdopen to
+create it for you.  Be warned that doing so may cause buffered data to be lost
+if you mix ANSI stdio calls on the FILE* with php stream calls on the stream.
+
+If your system has the fopencookie function, php streams can synthesize a
+FILE* on top of any stream, which is useful for SSL sockets, memory based
+streams, data base streams etc. etc.
+
+In situations where this is not desirable, you should query the stream
+to see if it naturally supports FILE *.  You can use this code snippet
+for this purpose:
+
+    if (php_stream_is(stream, PHP_STREAM_IS_STDIO)) {
+        /* can safely cast to FILE* with no adverse side effects */
+    }
+
+You can use:
+
+PHPAPI int php_stream_can_cast(php_stream * stream, int castas)
+
+to find out if a stream can be cast, without actually performing the cast, so
+to check if a stream is a socket you might use:
+
+if (php_stream_can_cast(stream, PHP_STREAM_AS_SOCKETD) == SUCCESS)  {
+    /* it can be a socket */
+}
+
+Please note the difference between php_stream_is and php_stream_can_cast;
+stream_is tells you if the stream is a particular type of stream, whereas
+can_cast tells you if the stream can be forced into the form you request.
+The former doesn't change anything, while the later *might* change some
+state in the stream.
+
+Stream Internals
+================
+
+There are two main structures associated with a stream - the php_stream
+itself, which holds some state information (and possibly a buffer) and a
+php_stream_ops structure, which holds the "virtual method table" for the
+underlying implementation.
+
+The php_streams ops struct consists of pointers to methods that implement
+read, write, close, flush, seek, gets and cast operations.  Of these, an
+implementation need only implement write, read, close and flush.  The gets
+method is intended to be used for streams if there is an underlying method
+that can efficiently behave as fgets.  The ops struct also contains a label
+for the implementation that will be used when printing error messages - the
+stdio implementation has a label of "STDIO" for example.
+
+The idea is that a stream implementation defines a php_stream_ops struct, and
+associates it with a php_stream using php_stream_alloc.
+
+As an example, the php_stream_fopen() function looks like this:
+
+PHPAPI php_stream * php_stream_fopen(const char * filename, const char * mode)
+{
+    FILE * fp = fopen(filename, mode);
+    php_stream * ret;
+
+    if (fp) {
+        ret = php_stream_alloc(&php_stream_stdio_ops, fp, 0, 0, mode);
+        if (ret)
+            return ret;
+
+        fclose(fp);
+    }
+    return NULL;
+}
+
+php_stream_stdio_ops is a php_stream_ops structure that can be used to handle
+FILE* based streams.
+
+A socket based stream would use code similar to that above to create a stream
+to be passed back to fopen_wrapper (or it's yet to be implemented successor).
+
+The prototype for php_stream_alloc is this:
+
+PHPAPI php_stream * php_stream_alloc(php_stream_ops * ops, void * abstract,
+        size_t bufsize, int persistent, const char * mode)
+
+ops is a pointer to the implementation,
+abstract holds implementation specific data that is relevant to this instance
+of the stream,
+bufsize is the size of the buffer to use - if 0, then buffering at the stream
+level will be disabled (recommended for underlying sources that implement
+their own buffering - such a FILE*),
+persistent controls how the memory is to be allocated - persistently so that
+it lasts across requests, or non-persistently so that it is freed at the end
+of a request (it uses pemalloc),
+mode is the stdio-like mode of operation - php streams places no real meaning
+in the mode parameter, except that it checks for a 'w' in the string when
+attempting to write (this may change).
+
+The mode parameter is passed on to fdopen/fopencookie when the stream is cast
+into a FILE*, so it should be compatible with the mode parameter of fopen().
+
+Writing your own stream implementation
+======================================
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+RULE #1: when writing your own streams: make sure you have configured PHP with
+--enable-debug.
+I've taken some great pains to hook into the Zend memory manager to help track
+down allocation problems.  It will also help you spot incorrect use of the
+STREAMS_DC, STREAMS_CC and the semi-private STREAMS_REL_CC macros for function
+definitions.
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+RULE #2: Please use the stdio stream as a reference; it will help you
+understand the semantics of the stream operations, and it will always
+be more up to date than these docs :-)
+
+First, you need to figure out what data you need to associate with the
+php_stream.  For example, you might need a pointer to some memory for memory
+based streams, or if you were making a stream to read data from an RDBMS like
+MySQL, you might want to store the connection and rowset handles.
+
+The stream has a field called abstract that you can use to hold this data.
+If you need to store more than a single field of data, define a structure to
+hold it, allocate it (use pemalloc with the persistent flag set
+appropriately), and use the abstract pointer to refer to it.
+
+For structured state you might have this:
+
+struct my_state {
+    MYSQL conn;
+    MYSQL_RES * result;
+};
+
+struct my_state * state = pemalloc(sizeof(struct my_state), persistent);
+
+/* initialize the connection, and run a query, using the fields in state to
+ * hold the results */
+
+state->result = mysql_use_result(&state->conn);
+
+/* now allocate the stream itself */
+stream = php_stream_alloc(&my_ops, state, 0, persistent, "r");
+
+/* now stream->abstract == state */
+
+Once you have that part figured out, you can write your implementation and
+define the your own php_stream_ops struct (we called it my_ops in the above
+example).
+
+For example, for reading from this weird MySQL stream:
+
+static size_t php_mysqlop_read(php_stream * stream, char * buf, size_t count)
+{
+    struct my_state * state = (struct my_state*)stream->abstract;
+
+    if (buf == NULL && count == 0)  {
+        /* in this special case, php_streams is asking if we have reached the
+         * end of file */
+        if (... at end of file ...)
+            return EOF;
+        else
+            return 0;
+    }
+
+    /* pull out some data from the stream and put it in buf */
+    ... mysql_fetch_row(state->result) ...
+    /* we could do something strange, like format the data as XML here,
+        and place that in the buf, but that brings in some complexities,
+        such as coping with a buffer size too small to hold the data,
+        so I won't even go in to how to do that here */
+}
+
+Implement the other operations - remember that write, read, close and flush
+are all mandatory.  The rest are optional.  Declare your stream ops struct:
+
+php_stream_ops my_ops = {
+    php_mysqlop_write, php_mysqlop_read, php_mysqlop_close,
+    php_mysqlop_flush, NULL, NULL, NULL,
+    "Strange MySQL example"
+}
+
+Thats it!
+
+Take a look at the STDIO implementation in streams.c for more information
+about how these operations work.
+The main thing to remember is that in your close operation you need to release
+and free the resources you allocated for the abstract field.  In the case of
+the example above, you need to use mysql_free_result on the rowset, close the
+connection and then use pefree to dispose of the struct you allocated.
+You may read the stream->persistent field to determine if your struct was
+allocated in persistent mode or not.
+
+vim:tw=78:et

+ 194 - 0
EVSE/GPL/php-7.3.28/README.SUBMITTING_PATCH

@@ -0,0 +1,194 @@
+Submitting Enhancements and Patches to PHP
+==========================================
+
+This document describes how to submit an enhancement or patch for PHP.
+It's easy!
+
+You don't need any login accounts or special access to download,
+build, debug and begin submitting PHP or PECL code, tests or
+documentation.  Once you've followed this README and had several
+patches accepted, commit privileges are often quickly granted.
+
+An excellent article to read first is:
+http://phpadvent.org/2008/less-whining-more-coding-by-elizabeth-smith
+
+
+Online Forums
+-------------
+There are several IRC channels where PHP developers are often
+available to discuss questions.  They include #php.pecl and #php.doc
+on the EFNet network and #winphp-dev on FreeNode.
+
+
+PHP Patches
+-----------
+If you are fixing broken functionality in PHP C source code first
+create a bug or identify an existing bug at http://bugs.php.net/.  A
+bug can be used to track the patch progress and prevent your changes
+getting lost in the PHP mail archives.
+
+If your change is large then create a Request For Comment (RFC) page
+on http://wiki.php.net/rfc, discuss it with the extension maintainer,
+and discuss it on the development mail list internals@lists.php.net.
+RFC Wiki accounts can be requested on
+http://wiki.php.net/start?do=register.  PHP extension maintainers can
+be found in the EXTENSIONS file in the PHP source.  Mail list
+subscription is explained on http://php.net/mailing-lists.php.
+
+Information on PHP internal C functions is at
+http://php.net/internals, though this is considered incomplete.
+Various external resources can be found on the web.  See
+https://wiki.php.net/internals for some references.  A standard
+printed reference is the book "Extending and Embedding PHP" by Sara
+Golemon.
+
+The preferred way to propose PHP patch is sending pull request from
+GitHub: https://github.com/php/php-src
+
+Fork the official PHP repository and send a pull request. A
+notification will be sent to the pull request mailing list. Sending a
+note to PHP Internals list (internals@lists.php.net) may help getting
+more feedback and quicker turnaround.  You can also add pull requests
+to bug reports at http://bugs.php.net/.
+
+If you are not using GitHub, attach your patch to a PHP bug and
+consider sending a notification email about the change to
+internals@lists.php.net.  If the bug is for an extension, also CC the
+extension maintainer.  Explain what has been changed by your patch.
+Test scripts should be included.
+
+Please make the mail subject prefix "[PATCH]".  If attaching a patch,
+ensure it has a file extension of ".txt".  This is because only MIME
+attachments of type 'text/*' are accepted.
+
+
+
+PHP Documentation Patches
+-------------------------
+If you are fixing incorrect PHP documentation first create a bug or
+identify an existing bug at http://bugs.php.net/.  A bug can be used
+to track the patch progress and prevent your changes getting lost in
+the PHP mail archives.
+
+If your change is large, then first discuss it with the mail list
+phpdoc@lists.php.net.  Subscription is explained on
+http://php.net/mailing-lists.php.
+
+Information on contributing to PHP documentation is at
+http://php.net/dochowto and http://wiki.php.net/doc/howto
+
+Attach the patch to the PHP bug and consider sending a notification
+email about the change to phpdoc@lists.php.net.  Explain what has been
+fixed/added/changed by your patch.
+
+Please make the mail subject prefix "[PATCH]".  Include the bug id(s)
+which can be closed by your patch.  If attaching a patch, ensure it
+has a file extension of ".txt".  This is because only MIME attachments
+of type 'text/*' are accepted.
+
+
+PECL Extension Patches: http://pecl.php.net/
+--------------------------------------------
+If you are fixing broken functionality in a PECL extension then create
+a bug or identify an existing bug at http://bugs.php.net/.  A bug
+can be used to track the patch progress and prevent your changes
+getting lost in the PHP mail archives.
+
+If your change is large then create a Request For Comment (RFC) page
+on http://wiki.php.net/rfc, discuss it with the extension maintainer,
+and discuss it on the development mail list pecl-dev@lists.php.net.
+PECL mail list subscription is explained on
+http://pecl.php.net/support.php.  RFC Wiki accounts can be requested
+on http://wiki.php.net/start?do=register
+
+Information on PHP internal C functions is at
+http://www.php.net/internals, though this is considered incomplete.
+Various external resources can be found on the web.  A standard
+printed reference is the book "Extending and Embedding PHP" by Sara
+Golemon.
+
+Update any open bugs and add a link to the source of your patch.  Send
+the patch or pointer to the bug to pecl-dev@lists.php.net.  Also CC
+the extension maintainer.  Explain what has been changed by your
+patch.  Test scripts should be included.
+
+Please make the mail subject prefix "[PATCH] ...".  Include the patch
+as an attachment with a file extension of ".txt".  This is because
+only MIME attachments of type 'text/*' are accepted.
+
+
+PEAR Package Patches: http://pear.php.net/
+------------------------------------------
+Information on contributing to PEAR is available at
+http://pear.php.net/manual/en/developers-newmaint.php and
+http://pear.php.net/manual/en/guide-developers.php
+
+
+How to create your PHP, PHP Documentation or PECL patch
+-------------------------------------------------------
+PHP and most PECL packages use Git for revision control. Some PECL
+packages use Subversion (SVN) Read http://www.php.net/git.php for help
+on using Git to get and build PHP source code.  We recommend to look
+at our workflow on https://wiki.php.net/vcs/gitworkflow and our FAQ
+https://wiki.php.net/vcs/gitfaq.
+
+Generally we ask that bug fix patches work on the current stable PHP
+development branches and on "master".  New PHP features only need to
+work on "master".
+
+Read CODING_STANDARDS before you start working.
+
+After modifying the source see README.TESTING and
+http://qa.php.net/write-test.php for how to test.  Submitting test
+scripts helps us to understand what functionality has changed.  It is
+important for the stability and maintainability of PHP that tests are
+comprehensive.
+
+After testing is finished, create a patch file using the command:
+
+  git diff > your_patch.txt
+
+For ease of review and later troubleshooting, submit individual
+patches for each bug or feature.
+
+
+Checklist for submitting your PHP or PECL code patch
+----------------------------------------------------
+ - Update git source just before running your final 'diff' and
+   before testing.
+ - Add in-line comments and/or have external documentation ready.
+   Use only "/* */" style comments, not "//".
+ - Create test scripts for use with "make test".
+ - Run "make test" to check your patch doesn't break other features.
+ - Rebuild PHP with --enable-debug (which will show some kinds of
+   memory errors) and check the PHP and web server error logs after
+   running your PHP tests.
+ - Rebuild PHP with --enable-maintainer-zts to check your patch
+   compiles on multi-threaded web servers.
+ - Review the patch once more just before submitting it.
+
+
+What happens after submitting your PHP, PHP Documentation or PECL patch
+-----------------------------------------------------------------------
+If your patch is easy to review and obviously has no side-effects,
+it might be committed relatively quickly.
+
+Because PHP is a volunteer-driven effort more complex patches will
+require patience on your side.  If you do not receive feedback in a
+few days, consider resubmitting the patch.  Before doing this think
+about these questions:
+
+ - Did I send the patch to the right mail list?
+ - Did I review the mail list archives to see if these kind of
+   changes had been discussed before?
+ - Did I explain my patch clearly?
+ - Is my patch too hard to review? Because of what factors?
+
+
+What happens when your PHP or PECL patch is applied
+---------------------------------------------------
+Your name will likely be included in the Git commit log.  If your
+patch affects end users, a brief description and your name might be
+added to the NEWS file.
+
+Thank you for patching PHP!

+ 316 - 0
EVSE/GPL/php-7.3.28/README.TESTING

@@ -0,0 +1,316 @@
+[IMPORTANT NOTICE]
+------------------
+ Failed tests usually indicate a problem with your local system setup
+and not within PHP itself (at least for official PHP release versions).
+You may decide to automatically submit a test summary to our QA workflow
+at the end of a test run.
+ Please do *not* submit a failed test as a bug or ask for help on why
+it failed on your system without providing substantial backup information
+on *why* the test failed on your special setup. Thank you :-)
+
+
+[Testing Basics]
+----------------
+ The easiest way to test your PHP build is to run "make test" from the
+command line after successfully compiling. This will run the complete
+tests for all enabled functionalities and extensions using the PHP
+CLI binary.
+ To execute test scripts, you must build PHP with some SAPI, then you
+type "make test" to execute all or some test scripts saved under
+"tests" directory under source root directory.
+
+Usage:
+make test
+
+ "make test" basically executes "run-tests.php" script
+under the source root (parallel builds will not work). Therefore you
+can execute the script as follows:
+
+TEST_PHP_EXECUTABLE=sapi/cli/php \
+sapi/cli/php [-c /path/to/php.ini] run-tests.php [ext/foo/tests/GLOB]
+
+
+[Which "php" executable "make test" look for]
+---------------------------------------------
+If you are running the run-tests.php script from the command line (as above)
+you must set the TEST_PHP_EXECUTABLE environment variable to explicitly
+select the PHP executable that is to be tested, that is, used to run the test scripts.
+
+If you run the tests using make test, the PHP CLI and CGI executables are
+automatically set for you. "make test" executes "run-tests.php" script with the CLI binary.  Some
+test scripts such as session must be executed by CGI SAPI. Therefore,
+you must build PHP with CGI SAPI to perform all tests.
+
+NOTE: PHP binary executing "run-tests.php" and php binary used for
+executing test scripts may differ. If you use different PHP binary for
+executing "run-tests.php" script, you may get errors.
+
+
+[Which php.ini is used]
+-----------------------
+ "make test" uses the same php.ini file as it would once installed.
+The tests have been written to be independent of that php.ini file,
+so if you find a test that is affected by a setting, please report
+this, so we can address the issue.
+
+
+[Which test scripts are executed]
+---------------------------------
+ "run-tests.php" ("make test"), without any arguments executes all
+test scripts by extracting all directories named "tests"
+from the source root and any subdirectories below. If there are files,
+which have a "phpt" extension, "run-tests.php" looks at the sections
+in these files, determines whether it should run it, by evaluating
+the 'SKIPIF' section. If the test is eligible for execution, the 'FILE'
+section is extracted into a ".php" file (with the same name besides
+the extension) and gets executed.
+When an argument is given or TESTS environment variable is set, the
+GLOB is expanded by the shell and any file with extension "*.phpt" is
+regarded as a test file.
+
+ Tester can easily execute tests selectively with as follows.
+
+Examples:
+./sapi/cli/php run-tests.php ext/mbstring/*
+./sapi/cli/php run-tests.php ext/mbstring/020.phpt
+
+
+[Test results]
+--------------
+ Test results are printed to standard output. If there is a failed test,
+the "run-tests.php" script saves the result, the expected result and the
+code executed to the test script directory. For example, if
+ext/myext/tests/myext.phpt fails to pass, the following files are created:
+
+ext/myext/tests/myext.php   - actual test file executed
+ext/myext/tests/myext.log   - log of test execution (L)
+ext/myext/tests/myext.exp   - expected output (E)
+ext/myext/tests/myext.out   - output from test script (O)
+ext/myext/tests/myext.diff  - diff of .out and .exp (D)
+
+ Failed tests are always bugs. Either the test is bugged or not considering
+factors applying to the tester's environment, or there is a bug in PHP.
+If this is a known bug, we strive to provide bug numbers, in either the
+test name or the file name. You can check the status of such a bug, by
+going to: http://bugs.php.net/12345 where 12345 is the bug number.
+For clarity and automated processing, bug numbers are prefixed by a hash
+sign '#' in test names and/or test cases are named bug12345.phpt.
+
+NOTE: The files generated by tests can be selected by setting the
+environment variable TEST_PHP_LOG_FORMAT. For each file you want to be
+generated use the character in brackets as shown above (default is LEOD).
+The php file will be generated always.
+
+NOTE: You can set environment variable TEST_PHP_DETAILED to enable
+detailed test information.
+
+[Automated Testing]
+--------------
+ If you like to keep up to speed, with latest developments and quality
+assurance, setting the environment variable NO_INTERACTION to 1, will not
+prompt the tester for any user input.
+
+Normally, the exit status of "make test" is zero, regardless of the results
+of independent tests. Set the environment variable REPORT_EXIT_STATUS to 1,
+and "make test" will set the exit status ("$?") to non-zero, when an
+individual test has failed.
+
+Example script to be run by cron(1):
+========== qa-test.sh =============
+#!/bin/sh
+
+CO_DIR=$HOME/cvs/php7
+MYMAIL=qa-test@domain.com
+TMPDIR=/var/tmp
+TODAY=`date +"%Y%m%d"`
+
+# Make sure compilation environment is correct
+CONFIGURE_OPTS='--disable-all --enable-cli --with-pcre'
+export MAKE=gmake
+export CC=gcc
+
+# Set test environment
+export NO_INTERACTION=1
+export REPORT_EXIT_STATUS=1
+
+cd $CO_DIR
+cvs update . >>$TMPDIR/phpqatest.$TODAY
+./cvsclean ; ./buildconf ; ./configure $CONFIGURE_OPTS ; $MAKE
+$MAKE test >>$TMPDIR/phpqatest.$TODAY 2>&1
+if test $? -gt 0
+then
+        cat $TMPDIR/phpqatest.$TODAY | mail -s"PHP-QA Test Failed for $TODAY" $MYMAIL
+fi
+========== end of qa-test.sh =============
+
+NOTE: The exit status of run-tests.php will be 1 when
+REPORT_EXIT_STATUS is set. The result of "make test" may be higher
+than that. At present, gmake 3.79.1 returns 2, so it is
+advised to test for non-zero, rather then a specific value.
+
+
+[Creating new test files]
+-------------------------
+ Writing test file is very easy if you are used to PHP.
+See the HOWTO at http://qa.php.net/write-test.php
+
+
+[How to help us]
+----------------
+ If you find bug in PHP, you can submit bug report AND test script
+for us. You don't have to write complete script, just give us test
+script with following format. Please test the script and make sure
+you write the correct ACTUAL OUTPUT and EXPECTED OUTPUT before you
+submit.
+
+<?php
+/*
+Bug #12345
+substr() bug. Do not return expected string.
+
+ACTUAL OUTPUT
+XYXA
+
+EXPECTED OUTPUT
+ABCD
+*/
+
+$str = "XYZABCD";
+echo substr($str,3,7);
+
+?>
+
+[IMPORTANT NOTICE]
+------------------
+This is an addendum to README.TESTING with additional information
+specific to server-tests.php.
+
+server-tests.php is backward compatible with tests developed for
+the original run-tests.php script.  server-tests is *not* used by
+'make test'.  server-tests was developed to provide support for
+testing PHP under it's primary environment, HTTP, and can run the
+PHP tests under any of the SAPI modules that are direct executables,
+or are accessible via HTTP.
+
+[New features]
+----------------
+* Command line interface:
+  You can run 'php server-tests.php -h' to get all the possible options.
+* Configuration file:
+  the -c argument will allow you to use a configuration file.  This is
+  handy if you are testing multiple environments and need various options
+  depending on the environment.
+  see server-tests-config.php for details.
+* CGI Emulation:
+  Will emulate a CGI environment when testing with the cgi sapi executable.
+* HTTP testing:
+  can be configured to run test scripts through an HTTP server running
+  on localhost.  localhost is required since either the web server must
+  alias a directory to the php source directory, or the test scripts
+  must be copied to a directory under the web server
+  (see config options TEST_WEB_BASE_URL, TEST_BASE_PATH, and TEST_WEB_EXT)
+* New sections supported for test files (see below)
+
+When running tests over http, tests that require ini settings different that what
+the web server runs under will be skipped.  Since the test harness defines a number
+of ini settings by default, the web server may require special configuration to
+make testing work.
+
+[Example Usage]
+----------------
+Some (but not all!) examples of usage:
+
+1. run tests from the php source directory
+    php server-tests.php -p /path/to/php-cli
+
+2. run tests using cgi emulation
+    php server-tests.php -p /path/to/php-cgi
+
+3. run tests over http, copying test files into document root
+    php server-tests.php -w -u http://localhost/test -m /path/to/htdocs/test
+
+4. run tests over http, php sources have been aliased in web server
+    php server-tests.php -w -u http://localhost/test
+
+5. run tests using configuration file
+    php server-tests.php -c /path/to/server-tests-config.php
+
+6. run tests using configuration file, but overriding some settings:
+   (config file must be first)
+    php server-tests.php -c /path/to/server-tests-config.php -w -t 3 -d /path/to/testdir
+
+NOTE: configuration as described in README.TESTING still works.
+
+[New Test Sections]
+----------------
+In addition to the traditional test sections
+(see http://qa.php.net/write-test.php), several new sections are available
+under server-tests.
+
+--POST--
+This is not a new section, but not multipart posts are supported for testing
+file uploads, or other types of POST data.
+
+--CGI--
+This section takes no value.  It merely provides a simple marker for tests
+that MUST be run as CGI, even if there is no --POST-- or --GET-- sections
+in the test file.
+
+--DESCRIPTION--
+Not used for anything, just a section for documenting the test
+
+--ENV--
+This section get's eval()'d to help build an environment for the
+execution of the test.  This can be used to change environment
+vars that are used for CGI emulation, or simply to set env vars
+for cli testing.  A full example looks like:
+
+  --ENV--
+  return <<<END
+  PATH_TRANSLATED=$filename
+  PATH_INFO=$scriptname
+  SCRIPT_NAME=$scriptname
+  END;
+
+Some variables are made easily available for use in this section, they
+include:
+  $filename     full native path to file, will become PATH_TRANSLATED
+  $filepath     =dirname($filename)
+  $scriptname   this is what will become SCRIPT_NAME unless you override it
+  $docroot      the equivalent of DOCUMENT_ROOT under Apache
+  $cwd          the directory that the test is being initiated from
+  $this->conf   all server-tests configuration vars
+  $this->env    all environment variables that will get passed to the test
+
+
+--REQUEST--
+This section is also eval'd, and is similar in nature to --ENV--.  However,
+this section is used to build the url used in an HTTP request.  Valid values
+to set in this section would include:
+  SCRIPT_NAME   The initial part of the request url
+  PATH_INFO     The pathinfo part of a request url
+  FRAGMENT      The fragment section of a url (after #)
+  QUERY_STRING  The query part of a url (after ?)
+
+  --REQUEST--
+  return <<<END
+  PATH_INFO=/path/info
+  END;
+
+--HEADERS--
+This section is also eval'd.  It is used to provide additional headers sent
+in an HTTP request, such as content type for multipart posts, cookies, etc.
+
+  --HEADERS--
+  return <<<END
+  Content-Type=multipart/form-data; boundary=---------------------------240723202011929
+  Content-Length=100
+  END;
+
+--EXPECTHEADERS--
+This section can be used to define what headers are required to be
+received back from a request, and is checked in addition to the
+regular expect sections.  For example:
+
+  --EXPECTHEADERS--
+  Status: 404

+ 123 - 0
EVSE/GPL/php-7.3.28/README.UNIX-BUILD-SYSTEM

@@ -0,0 +1,123 @@
+PHP Build System V5 Overview
+
+- supports Makefile.ins during transition phase
+- not-really-portable Makefile includes have been eliminated
+- supports separate build directories without VPATH by using
+  explicit rules only
+- does not waste disk-space/CPU-time for building temporary libraries
+  => especially noticeable on slower systems
+- slow recursive make replaced with one global Makefile
+- eases integration of proper dependencies
+- adds PHP_DEFINE(what[, value]) which creates a single include-file
+  per what.  This will allow more fine-grained dependencies.
+- abandoning the "one library per directory" concept
+- improved integration of the CLI
+- several new targets
+  build-modules: builds and copies dynamic modules into modules/
+  install-cli: installs the CLI only, so that the install-sapi
+               target does only what its name says
+- finally abandoned automake (still requires aclocal at this time)
+- changed some configure-time constructs to run at buildconf-time
+- upgraded shtool to 1.5.4
+- removed $(moduledir) (use EXTENSION_DIR)
+
+The Reason For a New System
+
+It became more and more apparent that there is a severe need
+for addressing the portability concerns and improving the chance
+that your build is correct (how often have you been told to
+"make clean"? When this is done, you won't need to anymore).
+
+
+If You Build PHP on a Unix System
+
+
+You, as a user of PHP, will notice no changes.  Of course, the build
+system will be faster, look better and work smarter.
+
+
+
+If You Are Developing PHP
+
+
+
+
+Extension developers:
+
+Makefile.ins are abandoned.  The files which are to be compiled
+are specified in the config.m4 now using the following macro:
+
+PHP_NEW_EXTENSION(foo, foo.c bar.c baz.cpp, $ext_shared)
+
+E.g. this enables the extension foo which consists of three source-code
+modules, two in C and one in C++.  And, depending on the user's wishes,
+the extension will even be built as a dynamic module.
+
+The full syntax:
+
+PHP_NEW_EXTENSION(extname, sources [, shared [,sapi_class[, extra-cflags]]])
+
+Please have a look at acinclude.m4 for the gory details and meanings
+of the other parameters.
+
+And that's basically it for the extension side.
+
+If you previously built sub-libraries for this module, add
+the source-code files here as well.  If you need to specify
+separate include directories, do it this way:
+
+PHP_NEW_EXTENSION(foo, foo.c mylib/bar.c mylib/gregor.c,,,-I@ext_srcdir@/lib)
+
+E.g. this builds the three files which are located relative to the
+extension source directory and compiles all three files with the
+special include directive (@ext_srcdir@ is automatically replaced).
+
+Now, you need to tell the build system that you want to build files
+in a directory called $ext_builddir/lib:
+
+PHP_ADD_BUILD_DIR($ext_builddir/lib)
+
+Make sure to call this after PHP_NEW_EXTENSION, because $ext_builddir
+is only set by the latter.
+
+If you have a complex extension, you might to need add special
+Make rules.  You can do this by calling PHP_ADD_MAKEFILE_FRAGMENT
+in your config.m4 after PHP_NEW_EXTENSION.
+
+This will read a file in the source-dir of your extension called
+Makefile.frag.  In this file, $(builddir) and $(srcdir) will be
+replaced by the values which are correct for your extension
+and which are again determined by the PHP_NEW_EXTENSION macro.
+
+Make sure to prefix *all* relative paths correctly with either
+$(builddir) or $(srcdir).  Because the build system does not
+change the working directory anymore, we must use either
+absolute paths or relative ones to the top build-directory.
+Correct prefixing ensures that.
+
+
+SAPI developers:
+
+Instead of using PHP_SAPI=foo/PHP_BUILD_XYZ, you will need to type
+
+PHP_SELECT_SAPI(name, type, sources.c)
+
+I.e. specify the source-code files as above and also pass the
+information regarding how PHP is supposed to be built (shared
+module, program, etc).
+
+For example for APXS:
+
+PHP_SELECT_SAPI(apache, shared, sapi_apache.c mod_php7.c php_apache.c)
+
+
+
+General info
+
+The foundation for the new system is the flexible handling of
+sources and their contexts.  With the help of macros you
+can define special flags for each source-file, where it is
+located, in which target context it can work, etc.
+
+Have a look at the well documented macros
+PHP_ADD_SOURCES(_X) in acinclude.m4.

+ 5 - 0
EVSE/GPL/php-7.3.28/README.WIN32-BUILD-SYSTEM

@@ -0,0 +1,5 @@
+The Win32 Build System.
+
+See https://wiki.php.net/internals/windows/stepbystepbuild_sdk_2
+
+vim:tw=78:sw=1:ts=1:et

+ 182 - 0
EVSE/GPL/php-7.3.28/README.input_filter

@@ -0,0 +1,182 @@
+Input Filter Support in PHP 5
+-----------------------------
+
+XSS (Cross Site Scripting) hacks are becoming more and more prevalent,
+and can be quite difficult to prevent.  Whenever you accept user data
+and somehow display this data back to users, you are likely vulnerable
+to XSS hacks.
+
+The Input Filter support in PHP 5 is aimed at providing the framework
+through which a company-wide or site-wide security policy can be
+enforced.  It is implemented as a SAPI hook and is called from the
+treat_data and post handler functions.  To implement your own security
+policy you will need to write a standard PHP extension.  There is also
+a powerful standard implementation in ext/filter that should suit most
+peoples' needs.  However, if you want to implement your own security
+policy, read on.
+
+A simple implementation might look like the following.  This stores the
+original raw user data and adds a my_get_raw() function while the normal
+$_POST, $_GET and $_COOKIE arrays are only populated with stripped
+data.  In this simple example all I am doing is calling strip_tags() on
+the data.
+
+ZEND_BEGIN_MODULE_GLOBALS(my_input_filter)
+        zval *post_array;
+        zval *get_array;
+        zval *cookie_array;
+ZEND_END_MODULE_GLOBALS(my_input_filter)
+
+#ifdef ZTS
+#define IF_G(v) TSRMG(my_input_filter_globals_id, zend_my_input_filter_globals *, v)
+#else
+#define IF_G(v) (my_input_filter_globals.v)
+#endif
+
+ZEND_DECLARE_MODULE_GLOBALS(my_input_filter)
+
+zend_function_entry my_input_filter_functions[] = {
+    PHP_FE(my_get_raw,   NULL)
+    {NULL, NULL, NULL}
+};
+
+zend_module_entry my_input_filter_module_entry = {
+    STANDARD_MODULE_HEADER,
+    "my_input_filter",
+    my_input_filter_functions,
+    PHP_MINIT(my_input_filter),
+    PHP_MSHUTDOWN(my_input_filter),
+    NULL,
+    PHP_RSHUTDOWN(my_input_filter),
+    PHP_MINFO(my_input_filter),
+    "0.1",
+    STANDARD_MODULE_PROPERTIES
+};
+
+PHP_MINIT_FUNCTION(my_input_filter)
+{
+    ZEND_INIT_MODULE_GLOBALS(my_input_filter, php_my_input_filter_init_globals, NULL);
+
+    REGISTER_LONG_CONSTANT("POST", PARSE_POST, CONST_CS | CONST_PERSISTENT);
+    REGISTER_LONG_CONSTANT("GET", PARSE_GET, CONST_CS | CONST_PERSISTENT);
+    REGISTER_LONG_CONSTANT("COOKIE", PARSE_COOKIE, CONST_CS | CONST_PERSISTENT);
+
+    sapi_register_input_filter(my_sapi_input_filter);
+    return SUCCESS;
+}
+
+PHP_RSHUTDOWN_FUNCTION(my_input_filter)
+{
+    if(IF_G(get_array)) {
+        zval_ptr_dtor(&IF_G(get_array));
+        IF_G(get_array) = NULL;
+    }
+    if(IF_G(post_array)) {
+        zval_ptr_dtor(&IF_G(post_array));
+        IF_G(post_array) = NULL;
+    }
+    if(IF_G(cookie_array)) {
+        zval_ptr_dtor(&IF_G(cookie_array));
+        IF_G(cookie_array) = NULL;
+    }
+    return SUCCESS;
+}
+
+PHP_MINFO_FUNCTION(my_input_filter)
+{
+    php_info_print_table_start();
+    php_info_print_table_row( 2, "My Input Filter Support", "enabled" );
+    php_info_print_table_end();
+}
+
+/* The filter handler. If you return 1 from it, then PHP also registers the
+ * (modified) variable. Returning 0 prevents PHP from registering the variable;
+ * you can use this if your filter already registers the variable under a
+ * different name, or if you just don't want the variable registered at all. */
+SAPI_INPUT_FILTER_FUNC(my_sapi_input_filter)
+{
+    zval new_var;
+    zval *array_ptr = NULL;
+    char *raw_var;
+    int var_len;
+
+    assert(*val != NULL);
+
+    switch(arg) {
+        case PARSE_GET:
+            if(!IF_G(get_array)) {
+                ALLOC_ZVAL(array_ptr);
+                array_init(array_ptr);
+                INIT_PZVAL(array_ptr);
+            }
+            IF_G(get_array) = array_ptr;
+            break;
+        case PARSE_POST:
+            if(!IF_G(post_array)) {
+                ALLOC_ZVAL(array_ptr);
+                array_init(array_ptr);
+                INIT_PZVAL(array_ptr);
+            }
+            IF_G(post_array) = array_ptr;
+            break;
+        case PARSE_COOKIE:
+            if(!IF_G(cookie_array)) {
+                ALLOC_ZVAL(array_ptr);
+                array_init(array_ptr);
+                INIT_PZVAL(array_ptr);
+            }
+            IF_G(cookie_array) = array_ptr;
+            break;
+    }
+    Z_STRLEN(new_var) = val_len;
+    Z_STRVAL(new_var) = estrndup(*val, val_len);
+    Z_TYPE(new_var) = IS_STRING;
+
+    var_len = strlen(var);
+    raw_var = emalloc(var_len+5);  /* RAW_ and a \0 */
+    strcpy(raw_var, "RAW_");
+    strlcat(raw_var,var,var_len+5);
+
+    php_register_variable_ex(raw_var, &new_var, array_ptr);
+
+    php_strip_tags(*val, val_len, NULL, NULL, 0);
+
+    *new_val_len = strlen(*val);
+    return 1;
+}
+
+PHP_FUNCTION(my_get_raw)
+{
+    long arg;
+    char *var;
+    int var_len;
+    zval **tmp;
+    zval *array_ptr = NULL;
+
+    if(zend_parse_parameters(2, "ls", &arg, &var, &var_len) == FAILURE) {
+        return;
+    }
+
+    switch(arg) {
+        case PARSE_GET:
+            array_ptr = IF_G(get_array);
+            break;
+        case PARSE_POST:
+            array_ptr = IF_G(post_array);
+            break;
+        case PARSE_COOKIE:
+            array_ptr = IF_G(post_array);
+            break;
+    }
+
+    if(!array_ptr) {
+        RETURN_FALSE;
+    }
+
+    if(zend_hash_find(HASH_OF(array_ptr), var, var_len+5, (void **)&tmp) == SUCCESS) {
+        *return_value = **tmp;
+        zval_copy_ctor(return_value);
+    } else {
+        RETVAL_FALSE;
+    }
+}

+ 39 - 0
EVSE/GPL/php-7.3.28/README.md

@@ -0,0 +1,39 @@
+The PHP Interpreter
+===================
+
+This is the github mirror of the official PHP repository located at
+https://git.php.net.
+
+[![Build Status](https://secure.travis-ci.org/php/php-src.svg?branch=master)](http://travis-ci.org/php/php-src)
+[![Build status](https://ci.appveyor.com/api/projects/status/meyur6fviaxgdwdy?svg=true)](https://ci.appveyor.com/project/php/php-src)
+
+Pull Requests
+=============
+PHP accepts pull requests via github. Discussions are done on github, but
+depending on the topic can also be relayed to the official PHP developer
+mailing list internals@lists.php.net.
+
+New features require an RFC and must be accepted by the developers.
+See https://wiki.php.net/rfc and https://wiki.php.net/rfc/voting for more
+information on the process.
+
+Bug fixes **do not** require an RFC, but require a bugtracker ticket. Always
+open a ticket at https://bugs.php.net and reference the bug id using #NNNNNN.
+
+    Fix #55371: get_magic_quotes_gpc() throws deprecation warning
+
+    After removing magic quotes, the get_magic_quotes_gpc function caused
+    a deprecate warning. get_magic_quotes_gpc can be used to detected
+    the magic_quotes behavior and therefore should not raise a warning at any
+    time. The patch removes this warning
+
+We do not merge pull requests directly on github. All PRs will be
+pulled and pushed through https://git.php.net.
+
+
+Guidelines for contributors
+===========================
+- [CODING_STANDARDS](/CODING_STANDARDS)
+- [README.GIT-RULES](/README.GIT-RULES)
+- [README.MAILINGLIST_RULES](/README.MAILINGLIST_RULES)
+- [README.RELEASE_PROCESS](/README.RELEASE_PROCESS)

+ 26 - 0
EVSE/GPL/php-7.3.28/TSRM/LICENSE

@@ -0,0 +1,26 @@
+Copyright (c) 1999-2006, Andi Gutmans, Sascha Schumann, Zeev Suraski.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+- Neither name of the copyright holders nor the names of their contributors
+may be used to endorse or promote products derived from this software
+without specific prior written permission.
+
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
+IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ 6 - 0
EVSE/GPL/php-7.3.28/TSRM/Makefile.am

@@ -0,0 +1,6 @@
+## process this file with automake to produce Makefile.am
+AUTOMAKE_OPTIONS=foreign
+noinst_LTLIBRARIES=libtsrm.la
+libtsrm_la_SOURCES = TSRM.c tsrm_strtok_r.c
+
+depend:

+ 808 - 0
EVSE/GPL/php-7.3.28/TSRM/TSRM.c

@@ -0,0 +1,808 @@
+/*
+   +----------------------------------------------------------------------+
+   | Thread Safe Resource Manager                                         |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1999-2011, Andi Gutmans, Sascha Schumann, Zeev Suraski |
+   | This source file is subject to the TSRM license, that is bundled     |
+   | with this package in the file LICENSE                                |
+   +----------------------------------------------------------------------+
+   | Authors:  Zeev Suraski <zeev@php.net>                                |
+   +----------------------------------------------------------------------+
+*/
+
+#include "TSRM.h"
+
+#ifdef ZTS
+
+#include <stdio.h>
+
+#if HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+
+typedef struct _tsrm_tls_entry tsrm_tls_entry;
+
+#if defined(TSRM_WIN32)
+/* TSRMLS_CACHE_DEFINE; is already done in Zend, this is being always compiled statically. */
+#endif
+
+struct _tsrm_tls_entry {
+	void **storage;
+	int count;
+	THREAD_T thread_id;
+	tsrm_tls_entry *next;
+};
+
+
+typedef struct {
+	size_t size;
+	ts_allocate_ctor ctor;
+	ts_allocate_dtor dtor;
+	int done;
+} tsrm_resource_type;
+
+
+/* The memory manager table */
+static tsrm_tls_entry	**tsrm_tls_table=NULL;
+static int				tsrm_tls_table_size;
+static ts_rsrc_id		id_count;
+
+/* The resource sizes table */
+static tsrm_resource_type	*resource_types_table=NULL;
+static int					resource_types_table_size;
+
+
+static MUTEX_T tsmm_mutex;	/* thread-safe memory manager mutex */
+
+/* New thread handlers */
+static tsrm_thread_begin_func_t tsrm_new_thread_begin_handler = NULL;
+static tsrm_thread_end_func_t tsrm_new_thread_end_handler = NULL;
+static tsrm_shutdown_func_t tsrm_shutdown_handler = NULL;
+
+/* Debug support */
+int tsrm_error(int level, const char *format, ...);
+
+/* Read a resource from a thread's resource storage */
+static int tsrm_error_level;
+static FILE *tsrm_error_file;
+
+#if TSRM_DEBUG
+#define TSRM_ERROR(args) tsrm_error args
+#define TSRM_SAFE_RETURN_RSRC(array, offset, range)																		\
+	{																													\
+		int unshuffled_offset = TSRM_UNSHUFFLE_RSRC_ID(offset);															\
+																														\
+		if (offset==0) {																								\
+			return &array;																								\
+		} else if ((unshuffled_offset)>=0 && (unshuffled_offset)<(range)) {												\
+			TSRM_ERROR((TSRM_ERROR_LEVEL_INFO, "Successfully fetched resource id %d for thread id %ld - 0x%0.8X",		\
+						unshuffled_offset, (long) thread_resources->thread_id, array[unshuffled_offset]));				\
+			return array[unshuffled_offset];																			\
+		} else {																										\
+			TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Resource id %d is out of range (%d..%d)",								\
+						unshuffled_offset, TSRM_SHUFFLE_RSRC_ID(0), TSRM_SHUFFLE_RSRC_ID(thread_resources->count-1)));	\
+			return NULL;																								\
+		}																												\
+	}
+#else
+#define TSRM_ERROR(args)
+#define TSRM_SAFE_RETURN_RSRC(array, offset, range)		\
+	if (offset==0) {									\
+		return &array;									\
+	} else {											\
+		return array[TSRM_UNSHUFFLE_RSRC_ID(offset)];	\
+	}
+#endif
+
+#if defined(GNUPTH)
+static pth_key_t tls_key;
+# define tsrm_tls_set(what)		pth_key_setdata(tls_key, (void*)(what))
+# define tsrm_tls_get()			pth_key_getdata(tls_key)
+
+#elif defined(PTHREADS)
+/* Thread local storage */
+static pthread_key_t tls_key;
+# define tsrm_tls_set(what)		pthread_setspecific(tls_key, (void*)(what))
+# define tsrm_tls_get()			pthread_getspecific(tls_key)
+
+#elif defined(TSRM_ST)
+static int tls_key;
+# define tsrm_tls_set(what)		st_thread_setspecific(tls_key, (void*)(what))
+# define tsrm_tls_get()			st_thread_getspecific(tls_key)
+
+#elif defined(TSRM_WIN32)
+static DWORD tls_key;
+# define tsrm_tls_set(what)		TlsSetValue(tls_key, (void*)(what))
+# define tsrm_tls_get()			TlsGetValue(tls_key)
+
+#else
+# define tsrm_tls_set(what)
+# define tsrm_tls_get()			NULL
+# warning tsrm_set_interpreter_context is probably broken on this platform
+#endif
+
+TSRM_TLS uint8_t in_main_thread = 0;
+
+/* Startup TSRM (call once for the entire process) */
+TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_level, char *debug_filename)
+{/*{{{*/
+#if defined(GNUPTH)
+	pth_init();
+	pth_key_create(&tls_key, 0);
+#elif defined(PTHREADS)
+	pthread_key_create( &tls_key, 0 );
+#elif defined(TSRM_ST)
+	st_init();
+	st_key_create(&tls_key, 0);
+#elif defined(TSRM_WIN32)
+	tls_key = TlsAlloc();
+#endif
+
+	/* ensure singleton */
+	in_main_thread = 1;
+
+	tsrm_error_file = stderr;
+	tsrm_error_set(debug_level, debug_filename);
+	tsrm_tls_table_size = expected_threads;
+
+	tsrm_tls_table = (tsrm_tls_entry **) calloc(tsrm_tls_table_size, sizeof(tsrm_tls_entry *));
+	if (!tsrm_tls_table) {
+		TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Unable to allocate TLS table"));
+		return 0;
+	}
+	id_count=0;
+
+	resource_types_table_size = expected_resources;
+	resource_types_table = (tsrm_resource_type *) calloc(resource_types_table_size, sizeof(tsrm_resource_type));
+	if (!resource_types_table) {
+		TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Unable to allocate resource types table"));
+		free(tsrm_tls_table);
+		tsrm_tls_table = NULL;
+		return 0;
+	}
+
+	tsmm_mutex = tsrm_mutex_alloc();
+
+	TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Started up TSRM, %d expected threads, %d expected resources", expected_threads, expected_resources));
+	return 1;
+}/*}}}*/
+
+
+/* Shutdown TSRM (call once for the entire process) */
+TSRM_API void tsrm_shutdown(void)
+{/*{{{*/
+	int i;
+
+	if (!in_main_thread) {
+		/* ensure singleton */
+		return;
+	}
+
+	if (tsrm_tls_table) {
+		for (i=0; i<tsrm_tls_table_size; i++) {
+			tsrm_tls_entry *p = tsrm_tls_table[i], *next_p;
+
+			while (p) {
+				int j;
+
+				next_p = p->next;
+				for (j=0; j<p->count; j++) {
+					if (p->storage[j]) {
+						if (resource_types_table && !resource_types_table[j].done && resource_types_table[j].dtor) {
+							resource_types_table[j].dtor(p->storage[j]);
+						}
+						free(p->storage[j]);
+					}
+				}
+				free(p->storage);
+				free(p);
+				p = next_p;
+			}
+		}
+		free(tsrm_tls_table);
+		tsrm_tls_table = NULL;
+	}
+	if (resource_types_table) {
+		free(resource_types_table);
+		resource_types_table=NULL;
+	}
+	tsrm_mutex_free(tsmm_mutex);
+	tsmm_mutex = NULL;
+	TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Shutdown TSRM"));
+	if (tsrm_error_file!=stderr) {
+		fclose(tsrm_error_file);
+	}
+#if defined(GNUPTH)
+	pth_kill();
+#elif defined(PTHREADS)
+	pthread_setspecific(tls_key, 0);
+	pthread_key_delete(tls_key);
+#elif defined(TSRM_WIN32)
+	TlsFree(tls_key);
+#endif
+	if (tsrm_shutdown_handler) {
+		tsrm_shutdown_handler();
+	}
+	tsrm_new_thread_begin_handler = NULL;
+	tsrm_new_thread_end_handler = NULL;
+	tsrm_shutdown_handler = NULL;
+}/*}}}*/
+
+
+/* allocates a new thread-safe-resource id */
+TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor)
+{/*{{{*/
+	int i;
+
+	TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Obtaining a new resource id, %d bytes", size));
+
+	tsrm_mutex_lock(tsmm_mutex);
+
+	/* obtain a resource id */
+	*rsrc_id = TSRM_SHUFFLE_RSRC_ID(id_count++);
+	TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Obtained resource id %d", *rsrc_id));
+
+	/* store the new resource type in the resource sizes table */
+	if (resource_types_table_size < id_count) {
+		tsrm_resource_type *_tmp;
+		_tmp = (tsrm_resource_type *) realloc(resource_types_table, sizeof(tsrm_resource_type)*id_count);
+		if (!_tmp) {
+			tsrm_mutex_unlock(tsmm_mutex);
+			TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Unable to allocate storage for resource"));
+			*rsrc_id = 0;
+			return 0;
+		}
+		resource_types_table = _tmp;
+		resource_types_table_size = id_count;
+	}
+	resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].size = size;
+	resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].ctor = ctor;
+	resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].dtor = dtor;
+	resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].done = 0;
+
+	/* enlarge the arrays for the already active threads */
+	for (i=0; i<tsrm_tls_table_size; i++) {
+		tsrm_tls_entry *p = tsrm_tls_table[i];
+
+		while (p) {
+			if (p->count < id_count) {
+				int j;
+
+				p->storage = (void *) realloc(p->storage, sizeof(void *)*id_count);
+				for (j=p->count; j<id_count; j++) {
+					p->storage[j] = (void *) malloc(resource_types_table[j].size);
+					if (resource_types_table[j].ctor) {
+						resource_types_table[j].ctor(p->storage[j]);
+					}
+				}
+				p->count = id_count;
+			}
+			p = p->next;
+		}
+	}
+	tsrm_mutex_unlock(tsmm_mutex);
+
+	TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Successfully allocated new resource id %d", *rsrc_id));
+	return *rsrc_id;
+}/*}}}*/
+
+
+static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_T thread_id)
+{/*{{{*/
+	int i;
+
+	TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Creating data structures for thread %x", thread_id));
+	(*thread_resources_ptr) = (tsrm_tls_entry *) malloc(sizeof(tsrm_tls_entry));
+	(*thread_resources_ptr)->storage = NULL;
+	if (id_count > 0) {
+		(*thread_resources_ptr)->storage = (void **) malloc(sizeof(void *)*id_count);
+	}
+	(*thread_resources_ptr)->count = id_count;
+	(*thread_resources_ptr)->thread_id = thread_id;
+	(*thread_resources_ptr)->next = NULL;
+
+	/* Set thread local storage to this new thread resources structure */
+	tsrm_tls_set(*thread_resources_ptr);
+
+	if (tsrm_new_thread_begin_handler) {
+		tsrm_new_thread_begin_handler(thread_id);
+	}
+	for (i=0; i<id_count; i++) {
+		if (resource_types_table[i].done) {
+			(*thread_resources_ptr)->storage[i] = NULL;
+		} else
+		{
+			(*thread_resources_ptr)->storage[i] = (void *) malloc(resource_types_table[i].size);
+			if (resource_types_table[i].ctor) {
+				resource_types_table[i].ctor((*thread_resources_ptr)->storage[i]);
+			}
+		}
+	}
+
+	if (tsrm_new_thread_end_handler) {
+		tsrm_new_thread_end_handler(thread_id);
+	}
+
+	tsrm_mutex_unlock(tsmm_mutex);
+}/*}}}*/
+
+
+/* fetches the requested resource for the current thread */
+TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id)
+{/*{{{*/
+	THREAD_T thread_id;
+	int hash_value;
+	tsrm_tls_entry *thread_resources;
+
+	if (!th_id) {
+		/* Fast path for looking up the resources for the current
+		 * thread. Its used by just about every call to
+		 * ts_resource_ex(). This avoids the need for a mutex lock
+		 * and our hashtable lookup.
+		 */
+		thread_resources = tsrm_tls_get();
+
+		if (thread_resources) {
+			TSRM_ERROR((TSRM_ERROR_LEVEL_INFO, "Fetching resource id %d for current thread %d", id, (long) thread_resources->thread_id));
+			/* Read a specific resource from the thread's resources.
+			 * This is called outside of a mutex, so have to be aware about external
+			 * changes to the structure as we read it.
+			 */
+			TSRM_SAFE_RETURN_RSRC(thread_resources->storage, id, thread_resources->count);
+		}
+		thread_id = tsrm_thread_id();
+	} else {
+		thread_id = *th_id;
+	}
+
+	TSRM_ERROR((TSRM_ERROR_LEVEL_INFO, "Fetching resource id %d for thread %ld", id, (long) thread_id));
+	tsrm_mutex_lock(tsmm_mutex);
+
+	hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size);
+	thread_resources = tsrm_tls_table[hash_value];
+
+	if (!thread_resources) {
+		allocate_new_resource(&tsrm_tls_table[hash_value], thread_id);
+		return ts_resource_ex(id, &thread_id);
+	} else {
+		 do {
+			if (thread_resources->thread_id == thread_id) {
+				break;
+			}
+			if (thread_resources->next) {
+				thread_resources = thread_resources->next;
+			} else {
+				allocate_new_resource(&thread_resources->next, thread_id);
+				return ts_resource_ex(id, &thread_id);
+				/*
+				 * thread_resources = thread_resources->next;
+				 * break;
+				 */
+			}
+		 } while (thread_resources);
+	}
+	tsrm_mutex_unlock(tsmm_mutex);
+	/* Read a specific resource from the thread's resources.
+	 * This is called outside of a mutex, so have to be aware about external
+	 * changes to the structure as we read it.
+	 */
+	TSRM_SAFE_RETURN_RSRC(thread_resources->storage, id, thread_resources->count);
+}/*}}}*/
+
+/* frees an interpreter context.  You are responsible for making sure that
+ * it is not linked into the TSRM hash, and not marked as the current interpreter */
+void tsrm_free_interpreter_context(void *context)
+{/*{{{*/
+	tsrm_tls_entry *next, *thread_resources = (tsrm_tls_entry*)context;
+	int i;
+
+	while (thread_resources) {
+		next = thread_resources->next;
+
+		for (i=0; i<thread_resources->count; i++) {
+			if (resource_types_table[i].dtor) {
+				resource_types_table[i].dtor(thread_resources->storage[i]);
+			}
+		}
+		for (i=0; i<thread_resources->count; i++) {
+			free(thread_resources->storage[i]);
+		}
+		free(thread_resources->storage);
+		free(thread_resources);
+		thread_resources = next;
+	}
+}/*}}}*/
+
+void *tsrm_set_interpreter_context(void *new_ctx)
+{/*{{{*/
+	tsrm_tls_entry *current;
+
+	current = tsrm_tls_get();
+
+	/* TODO: unlink current from the global linked list, and replace it
+	 * it with the new context, protected by mutex where/if appropriate */
+
+	/* Set thread local storage to this new thread resources structure */
+	tsrm_tls_set(new_ctx);
+
+	/* return old context, so caller can restore it when they're done */
+	return current;
+}/*}}}*/
+
+
+/* allocates a new interpreter context */
+void *tsrm_new_interpreter_context(void)
+{/*{{{*/
+	tsrm_tls_entry *new_ctx, *current;
+	THREAD_T thread_id;
+
+	thread_id = tsrm_thread_id();
+	tsrm_mutex_lock(tsmm_mutex);
+
+	current = tsrm_tls_get();
+
+	allocate_new_resource(&new_ctx, thread_id);
+
+	/* switch back to the context that was in use prior to our creation
+	 * of the new one */
+	return tsrm_set_interpreter_context(current);
+}/*}}}*/
+
+
+/* frees all resources allocated for the current thread */
+void ts_free_thread(void)
+{/*{{{*/
+	tsrm_tls_entry *thread_resources;
+	int i;
+	THREAD_T thread_id = tsrm_thread_id();
+	int hash_value;
+	tsrm_tls_entry *last=NULL;
+
+	tsrm_mutex_lock(tsmm_mutex);
+	hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size);
+	thread_resources = tsrm_tls_table[hash_value];
+
+	while (thread_resources) {
+		if (thread_resources->thread_id == thread_id) {
+			for (i=0; i<thread_resources->count; i++) {
+				if (resource_types_table[i].dtor) {
+					resource_types_table[i].dtor(thread_resources->storage[i]);
+				}
+			}
+			for (i=0; i<thread_resources->count; i++) {
+				free(thread_resources->storage[i]);
+			}
+			free(thread_resources->storage);
+			if (last) {
+				last->next = thread_resources->next;
+			} else {
+				tsrm_tls_table[hash_value] = thread_resources->next;
+			}
+			tsrm_tls_set(0);
+			free(thread_resources);
+			break;
+		}
+		if (thread_resources->next) {
+			last = thread_resources;
+		}
+		thread_resources = thread_resources->next;
+	}
+	tsrm_mutex_unlock(tsmm_mutex);
+}/*}}}*/
+
+
+/* frees all resources allocated for all threads except current */
+void ts_free_worker_threads(void)
+{/*{{{*/
+	tsrm_tls_entry *thread_resources;
+	int i;
+	THREAD_T thread_id = tsrm_thread_id();
+	int hash_value;
+	tsrm_tls_entry *last=NULL;
+
+	tsrm_mutex_lock(tsmm_mutex);
+	hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size);
+	thread_resources = tsrm_tls_table[hash_value];
+
+	while (thread_resources) {
+		if (thread_resources->thread_id != thread_id) {
+			for (i=0; i<thread_resources->count; i++) {
+				if (resource_types_table[i].dtor) {
+					resource_types_table[i].dtor(thread_resources->storage[i]);
+				}
+			}
+			for (i=0; i<thread_resources->count; i++) {
+				free(thread_resources->storage[i]);
+			}
+			free(thread_resources->storage);
+			if (last) {
+				last->next = thread_resources->next;
+			} else {
+				tsrm_tls_table[hash_value] = thread_resources->next;
+			}
+			free(thread_resources);
+			if (last) {
+				thread_resources = last->next;
+			} else {
+				thread_resources = tsrm_tls_table[hash_value];
+			}
+		} else {
+			if (thread_resources->next) {
+				last = thread_resources;
+			}
+			thread_resources = thread_resources->next;
+		}
+	}
+	tsrm_mutex_unlock(tsmm_mutex);
+}/*}}}*/
+
+
+/* deallocates all occurrences of a given id */
+void ts_free_id(ts_rsrc_id id)
+{/*{{{*/
+	int i;
+	int j = TSRM_UNSHUFFLE_RSRC_ID(id);
+
+	tsrm_mutex_lock(tsmm_mutex);
+
+	TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Freeing resource id %d", id));
+
+	if (tsrm_tls_table) {
+		for (i=0; i<tsrm_tls_table_size; i++) {
+			tsrm_tls_entry *p = tsrm_tls_table[i];
+
+			while (p) {
+				if (p->count > j && p->storage[j]) {
+					if (resource_types_table && resource_types_table[j].dtor) {
+						resource_types_table[j].dtor(p->storage[j]);
+					}
+					free(p->storage[j]);
+					p->storage[j] = NULL;
+				}
+				p = p->next;
+			}
+		}
+	}
+	resource_types_table[j].done = 1;
+
+	tsrm_mutex_unlock(tsmm_mutex);
+
+	TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Successfully freed resource id %d", id));
+}/*}}}*/
+
+
+
+
+/*
+ * Utility Functions
+ */
+
+/* Obtain the current thread id */
+TSRM_API THREAD_T tsrm_thread_id(void)
+{/*{{{*/
+#ifdef TSRM_WIN32
+	return GetCurrentThreadId();
+#elif defined(GNUPTH)
+	return pth_self();
+#elif defined(PTHREADS)
+	return pthread_self();
+#elif defined(TSRM_ST)
+	return st_thread_self();
+#endif
+}/*}}}*/
+
+
+/* Allocate a mutex */
+TSRM_API MUTEX_T tsrm_mutex_alloc(void)
+{/*{{{*/
+	MUTEX_T mutexp;
+#ifdef TSRM_WIN32
+	mutexp = malloc(sizeof(CRITICAL_SECTION));
+	InitializeCriticalSection(mutexp);
+#elif defined(GNUPTH)
+	mutexp = (MUTEX_T) malloc(sizeof(*mutexp));
+	pth_mutex_init(mutexp);
+#elif defined(PTHREADS)
+	mutexp = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
+	pthread_mutex_init(mutexp,NULL);
+#elif defined(TSRM_ST)
+	mutexp = st_mutex_new();
+#endif
+#ifdef THR_DEBUG
+	printf("Mutex created thread: %d\n",mythreadid());
+#endif
+	return( mutexp );
+}/*}}}*/
+
+
+/* Free a mutex */
+TSRM_API void tsrm_mutex_free(MUTEX_T mutexp)
+{/*{{{*/
+	if (mutexp) {
+#ifdef TSRM_WIN32
+		DeleteCriticalSection(mutexp);
+		free(mutexp);
+#elif defined(GNUPTH)
+		free(mutexp);
+#elif defined(PTHREADS)
+		pthread_mutex_destroy(mutexp);
+		free(mutexp);
+#elif defined(TSRM_ST)
+		st_mutex_destroy(mutexp);
+#endif
+	}
+#ifdef THR_DEBUG
+	printf("Mutex freed thread: %d\n",mythreadid());
+#endif
+}/*}}}*/
+
+
+/*
+  Lock a mutex.
+  A return value of 0 indicates success
+*/
+TSRM_API int tsrm_mutex_lock(MUTEX_T mutexp)
+{/*{{{*/
+	TSRM_ERROR((TSRM_ERROR_LEVEL_INFO, "Mutex locked thread: %ld", tsrm_thread_id()));
+#ifdef TSRM_WIN32
+	EnterCriticalSection(mutexp);
+	return 0;
+#elif defined(GNUPTH)
+	if (pth_mutex_acquire(mutexp, 0, NULL)) {
+		return 0;
+	}
+	return -1;
+#elif defined(PTHREADS)
+	return pthread_mutex_lock(mutexp);
+#elif defined(TSRM_ST)
+	return st_mutex_lock(mutexp);
+#endif
+}/*}}}*/
+
+
+/*
+  Unlock a mutex.
+  A return value of 0 indicates success
+*/
+TSRM_API int tsrm_mutex_unlock(MUTEX_T mutexp)
+{/*{{{*/
+	TSRM_ERROR((TSRM_ERROR_LEVEL_INFO, "Mutex unlocked thread: %ld", tsrm_thread_id()));
+#ifdef TSRM_WIN32
+	LeaveCriticalSection(mutexp);
+	return 0;
+#elif defined(GNUPTH)
+	if (pth_mutex_release(mutexp)) {
+		return 0;
+	}
+	return -1;
+#elif defined(PTHREADS)
+	return pthread_mutex_unlock(mutexp);
+#elif defined(TSRM_ST)
+	return st_mutex_unlock(mutexp);
+#endif
+}/*}}}*/
+
+/*
+  Changes the signal mask of the calling thread
+*/
+#ifdef HAVE_SIGPROCMASK
+TSRM_API int tsrm_sigmask(int how, const sigset_t *set, sigset_t *oldset)
+{/*{{{*/
+	TSRM_ERROR((TSRM_ERROR_LEVEL_INFO, "Changed sigmask in thread: %ld", tsrm_thread_id()));
+	/* TODO: add support for other APIs */
+#ifdef PTHREADS
+	return pthread_sigmask(how, set, oldset);
+#else
+	return sigprocmask(how, set, oldset);
+#endif
+}/*}}}*/
+#endif
+
+
+TSRM_API void *tsrm_set_new_thread_begin_handler(tsrm_thread_begin_func_t new_thread_begin_handler)
+{/*{{{*/
+	void *retval = (void *) tsrm_new_thread_begin_handler;
+
+	tsrm_new_thread_begin_handler = new_thread_begin_handler;
+	return retval;
+}/*}}}*/
+
+
+TSRM_API void *tsrm_set_new_thread_end_handler(tsrm_thread_end_func_t new_thread_end_handler)
+{/*{{{*/
+	void *retval = (void *) tsrm_new_thread_end_handler;
+
+	tsrm_new_thread_end_handler = new_thread_end_handler;
+	return retval;
+}/*}}}*/
+
+
+TSRM_API void *tsrm_set_shutdown_handler(tsrm_shutdown_func_t shutdown_handler)
+{/*{{{*/
+	void *retval = (void *) tsrm_shutdown_handler;
+
+	tsrm_shutdown_handler = shutdown_handler;
+	return retval;
+}/*}}}*/
+
+
+/*
+ * Debug support
+ */
+
+#if TSRM_DEBUG
+int tsrm_error(int level, const char *format, ...)
+{/*{{{*/
+	if (level<=tsrm_error_level) {
+		va_list args;
+		int size;
+
+		fprintf(tsrm_error_file, "TSRM:  ");
+		va_start(args, format);
+		size = vfprintf(tsrm_error_file, format, args);
+		va_end(args);
+		fprintf(tsrm_error_file, "\n");
+		fflush(tsrm_error_file);
+		return size;
+	} else {
+		return 0;
+	}
+}/*}}}*/
+#endif
+
+
+void tsrm_error_set(int level, char *debug_filename)
+{/*{{{*/
+	tsrm_error_level = level;
+
+#if TSRM_DEBUG
+	if (tsrm_error_file!=stderr) { /* close files opened earlier */
+		fclose(tsrm_error_file);
+	}
+
+	if (debug_filename) {
+		tsrm_error_file = fopen(debug_filename, "w");
+		if (!tsrm_error_file) {
+			tsrm_error_file = stderr;
+		}
+	} else {
+		tsrm_error_file = stderr;
+	}
+#endif
+}/*}}}*/
+
+TSRM_API void *tsrm_get_ls_cache(void)
+{/*{{{*/
+	return tsrm_tls_get();
+}/*}}}*/
+
+TSRM_API uint8_t tsrm_is_main_thread(void)
+{/*{{{*/
+	return in_main_thread;
+}/*}}}*/
+
+TSRM_API const char *tsrm_api_name(void)
+{/*{{{*/
+#if defined(GNUPTH)
+	return "GNU Pth";
+#elif defined(PTHREADS)
+	return "POSIX Threads";
+#elif defined(TSRM_ST)
+	return "State Threads";
+#elif defined(TSRM_WIN32)
+	return "Windows Threads";
+#else
+	return "Unknown";
+#endif
+}/*}}}*/
+
+#endif /* ZTS */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */

+ 215 - 0
EVSE/GPL/php-7.3.28/TSRM/TSRM.h

@@ -0,0 +1,215 @@
+/*
+   +----------------------------------------------------------------------+
+   | Thread Safe Resource Manager                                         |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1999-2011, Andi Gutmans, Sascha Schumann, Zeev Suraski |
+   | This source file is subject to the TSRM license, that is bundled     |
+   | with this package in the file LICENSE                                |
+   +----------------------------------------------------------------------+
+   | Authors:  Zeev Suraski <zeev@php.net>                                |
+   +----------------------------------------------------------------------+
+*/
+
+#ifndef TSRM_H
+#define TSRM_H
+
+#if !defined(__CYGWIN__) && defined(WIN32)
+# define TSRM_WIN32
+# include "tsrm_config.w32.h"
+#else
+# include <tsrm_config.h>
+#endif
+
+#include "main/php_stdint.h"
+
+#ifdef TSRM_WIN32
+#	ifdef TSRM_EXPORTS
+#		define TSRM_API __declspec(dllexport)
+#	else
+#		define TSRM_API __declspec(dllimport)
+#	endif
+#elif defined(__GNUC__) && __GNUC__ >= 4
+#	define TSRM_API __attribute__ ((visibility("default")))
+#else
+#	define TSRM_API
+#endif
+
+typedef intptr_t tsrm_intptr_t;
+typedef uintptr_t tsrm_uintptr_t;
+
+/* Only compile multi-threading functions if we're in ZTS mode */
+#ifdef ZTS
+
+#ifdef TSRM_WIN32
+# ifndef TSRM_INCLUDE_FULL_WINDOWS_HEADERS
+#  define WIN32_LEAN_AND_MEAN
+# endif
+# include <windows.h>
+# include <shellapi.h>
+#elif defined(GNUPTH)
+# include <pth.h>
+#elif defined(PTHREADS)
+# include <pthread.h>
+#elif defined(TSRM_ST)
+# include <st.h>
+#elif defined(BETHREADS)
+#include <kernel/OS.h>
+#include <TLS.h>
+#endif
+
+typedef int ts_rsrc_id;
+
+/* Define THREAD_T and MUTEX_T */
+#ifdef TSRM_WIN32
+# define THREAD_T DWORD
+# define MUTEX_T CRITICAL_SECTION *
+#elif defined(GNUPTH)
+# define THREAD_T pth_t
+# define MUTEX_T pth_mutex_t *
+#elif defined(PTHREADS)
+# define THREAD_T pthread_t
+# define MUTEX_T pthread_mutex_t *
+#elif defined(TSRM_ST)
+# define THREAD_T st_thread_t
+# define MUTEX_T st_mutex_t
+#endif
+
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
+
+typedef void (*ts_allocate_ctor)(void *);
+typedef void (*ts_allocate_dtor)(void *);
+
+#define THREAD_HASH_OF(thr,ts)  (unsigned long)thr%(unsigned long)ts
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* startup/shutdown */
+TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_level, char *debug_filename);
+TSRM_API void tsrm_shutdown(void);
+
+/* allocates a new thread-safe-resource id */
+TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor);
+
+/* fetches the requested resource for the current thread */
+TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id);
+#define ts_resource(id)			ts_resource_ex(id, NULL)
+
+/* frees all resources allocated for the current thread */
+TSRM_API void ts_free_thread(void);
+
+/* frees all resources allocated for all threads except current */
+void ts_free_worker_threads(void);
+
+/* deallocates all occurrences of a given id */
+TSRM_API void ts_free_id(ts_rsrc_id id);
+
+
+/* Debug support */
+#define TSRM_ERROR_LEVEL_ERROR	1
+#define TSRM_ERROR_LEVEL_CORE	2
+#define TSRM_ERROR_LEVEL_INFO	3
+
+typedef void (*tsrm_thread_begin_func_t)(THREAD_T thread_id);
+typedef void (*tsrm_thread_end_func_t)(THREAD_T thread_id);
+typedef void (*tsrm_shutdown_func_t)(void);
+
+
+TSRM_API int tsrm_error(int level, const char *format, ...);
+TSRM_API void tsrm_error_set(int level, char *debug_filename);
+
+/* utility functions */
+TSRM_API THREAD_T tsrm_thread_id(void);
+TSRM_API MUTEX_T tsrm_mutex_alloc(void);
+TSRM_API void tsrm_mutex_free(MUTEX_T mutexp);
+TSRM_API int tsrm_mutex_lock(MUTEX_T mutexp);
+TSRM_API int tsrm_mutex_unlock(MUTEX_T mutexp);
+#ifdef HAVE_SIGPROCMASK
+TSRM_API int tsrm_sigmask(int how, const sigset_t *set, sigset_t *oldset);
+#endif
+
+TSRM_API void *tsrm_set_new_thread_begin_handler(tsrm_thread_begin_func_t new_thread_begin_handler);
+TSRM_API void *tsrm_set_new_thread_end_handler(tsrm_thread_end_func_t new_thread_end_handler);
+TSRM_API void *tsrm_set_shutdown_handler(tsrm_shutdown_func_t shutdown_handler);
+
+/* these 3 APIs should only be used by people that fully understand the threading model
+ * used by PHP/Zend and the selected SAPI. */
+TSRM_API void *tsrm_new_interpreter_context(void);
+TSRM_API void *tsrm_set_interpreter_context(void *new_ctx);
+TSRM_API void tsrm_free_interpreter_context(void *context);
+
+TSRM_API void *tsrm_get_ls_cache(void);
+TSRM_API uint8_t tsrm_is_main_thread(void);
+TSRM_API const char *tsrm_api_name(void);
+
+#if defined(__cplusplus) && __cplusplus > 199711L
+# define TSRM_TLS thread_local
+#else
+# ifdef TSRM_WIN32
+#  define TSRM_TLS __declspec(thread)
+# else
+#  define TSRM_TLS __thread
+# endif
+#endif
+
+#define TSRM_SHUFFLE_RSRC_ID(rsrc_id)		((rsrc_id)+1)
+#define TSRM_UNSHUFFLE_RSRC_ID(rsrc_id)		((rsrc_id)-1)
+
+#define TSRMLS_FETCH_FROM_CTX(ctx)	void ***tsrm_ls = (void ***) ctx
+#define TSRMLS_SET_CTX(ctx)		ctx = (void ***) tsrm_get_ls_cache()
+#define TSRMG(id, type, element)	(TSRMG_BULK(id, type)->element)
+#define TSRMG_BULK(id, type)	((type) (*((void ***) tsrm_get_ls_cache()))[TSRM_UNSHUFFLE_RSRC_ID(id)])
+
+#define TSRMG_STATIC(id, type, element)	(TSRMG_BULK_STATIC(id, type)->element)
+#define TSRMG_BULK_STATIC(id, type)	((type) (*((void ***) TSRMLS_CACHE))[TSRM_UNSHUFFLE_RSRC_ID(id)])
+#define TSRMLS_CACHE_EXTERN() extern TSRM_TLS void *TSRMLS_CACHE;
+#define TSRMLS_CACHE_DEFINE() TSRM_TLS void *TSRMLS_CACHE = NULL;
+#define TSRMLS_CACHE_UPDATE() TSRMLS_CACHE = tsrm_get_ls_cache()
+#define TSRMLS_CACHE _tsrm_ls_cache
+
+/* BC only */
+#define TSRMLS_D void
+#define TSRMLS_DC
+#define TSRMLS_C
+#define TSRMLS_CC
+#define TSRMLS_FETCH()
+
+#ifdef __cplusplus
+}
+#endif
+
+#else /* non ZTS */
+
+#define TSRMLS_FETCH()
+#define TSRMLS_FETCH_FROM_CTX(ctx)
+#define TSRMLS_SET_CTX(ctx)
+
+#define TSRMG_STATIC(id, type, element)
+#define TSRMLS_CACHE_EXTERN()
+#define TSRMLS_CACHE_DEFINE()
+#define TSRMLS_CACHE_UPDATE()
+#define TSRMLS_CACHE
+
+#define TSRM_TLS
+
+/* BC only */
+#define TSRMLS_D	void
+#define TSRMLS_DC
+#define TSRMLS_C
+#define TSRMLS_CC
+
+#endif /* ZTS */
+
+#endif /* TSRM_H */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */

+ 3 - 0
EVSE/GPL/php-7.3.28/TSRM/acinclude.m4

@@ -0,0 +1,3 @@
+AC_DEFUN([AM_SET_LIBTOOL_VARIABLE],[
+  LIBTOOL='$(SHELL) $(top_builddir)/libtool $1'
+])

+ 33 - 0
EVSE/GPL/php-7.3.28/TSRM/buildconf

@@ -0,0 +1,33 @@
+#!/bin/sh
+
+case "$1" in
+--copy)
+	automake_flags=--copy
+	shift
+;;
+esac
+
+libtoolize --force --automake $automake_flags
+
+mv aclocal.m4 aclocal.m4.old 2>/dev/null
+aclocal
+if cmp aclocal.m4.old aclocal.m4 > /dev/null 2>&1; then
+    echo "buildconf: keeping ${1}aclocal.m4"
+    mv aclocal.m4.old aclocal.m4
+else
+    echo "buildconf: created or modified ${1}aclocal.m4"
+fi
+
+autoheader
+
+automake --add-missing --include-deps $automake_flags
+
+mv configure configure.old 2>/dev/null
+autoconf
+if cmp configure.old configure > /dev/null 2>&1; then
+    echo "buildconf: keeping ${1}configure"
+    mv configure.old configure
+else
+    echo "buildconf: created or modified ${1}configure"
+fi
+

+ 4 - 0
EVSE/GPL/php-7.3.28/TSRM/config.w32

@@ -0,0 +1,4 @@
+// vim:ft=javascript
+
+ADD_SOURCES("TSRM", "TSRM.c tsrm_strtok_r.c tsrm_win32.c");
+ADD_FLAG("CFLAGS_BD_TSRM", "/D ZEND_ENABLE_STATIC_TSRMLS_CACHE=1");

+ 35 - 0
EVSE/GPL/php-7.3.28/TSRM/configure.ac

@@ -0,0 +1,35 @@
+dnl
+dnl Minimalistic configure.ac for TSRM.
+dnl
+
+AC_INIT(TSRM.c)
+AM_INIT_AUTOMAKE(TSRM, 1.0, nodefine)
+AM_CONFIG_HEADER(tsrm_config.h)
+
+AH_TOP([
+#undef PTHREADS
+])
+
+sinclude(tsrm.m4)
+
+TSRM_BASIC_CHECKS
+TSRM_THREADS_CHECKS
+
+AM_PROG_LIBTOOL
+if test "$enable_debug" != "yes"; then
+  AM_SET_LIBTOOL_VARIABLE([--silent])
+fi
+
+dnl TSRM_PTHREAD
+
+AC_CHECK_HEADERS(
+utime.h \
+dirent.h \
+stdarg.h \
+alloca.h \
+unistd.h \
+limits.h
+)
+
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT

+ 196 - 0
EVSE/GPL/php-7.3.28/TSRM/m4/ax_func_which_gethostbyname_r.m4

@@ -0,0 +1,196 @@
+# ==================================================================================
+#  https://www.gnu.org/software/autoconf-archive/ax_func_which_gethostbyname_r.html
+# ==================================================================================
+#
+# SYNOPSIS
+#
+#   AX_FUNC_WHICH_GETHOSTBYNAME_R
+#
+# DESCRIPTION
+#
+#   Determines which historical variant of the gethostbyname_r() call
+#   (taking three, five, or six arguments) is available on the system and
+#   defines one of the following macros accordingly:
+#
+#     HAVE_FUNC_GETHOSTBYNAME_R_6
+#     HAVE_FUNC_GETHOSTBYNAME_R_5
+#     HAVE_FUNC_GETHOSTBYNAME_R_3
+#
+#   as well as
+#
+#     HAVE_GETHOSTBYNAME_R
+#
+#   If used in conjunction with gethostname.c, the API demonstrated in
+#   test.c can be used regardless of which gethostbyname_r() is available.
+#   These example files can be found at
+#   http://www.csn.ul.ie/~caolan/publink/gethostbyname_r
+#
+#   based on David Arnold's autoconf suggestion in the threads faq
+#
+#   Originally named "AC_caolan_FUNC_WHICH_GETHOSTBYNAME_R". Rewritten for
+#   Autoconf 2.5x, and updated for 2.68 by Daniel Richard G.
+#
+# LICENSE
+#
+#   Copyright (c) 2008 Caolan McNamara <caolan@skynet.ie>
+#   Copyright (c) 2008 Daniel Richard G. <skunk@iskunk.org>
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by the
+#   Free Software Foundation; either version 2 of the License, or (at your
+#   option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+#   Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License along
+#   with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+#   As a special exception, the respective Autoconf Macro's copyright owner
+#   gives unlimited permission to copy, distribute and modify the configure
+#   scripts that are the output of Autoconf when processing the Macro. You
+#   need not follow the terms of the GNU General Public License when using
+#   or distributing such scripts, even though portions of the text of the
+#   Macro appear in them. The GNU General Public License (GPL) does govern
+#   all other use of the material that constitutes the Autoconf Macro.
+#
+#   This special exception to the GPL applies to versions of the Autoconf
+#   Macro released by the Autoconf Archive. When you make and distribute a
+#   modified version of the Autoconf Macro, you may extend this special
+#   exception to the GPL to apply to your modified version as well.
+
+#serial 8
+
+AC_DEFUN([AX_FUNC_WHICH_GETHOSTBYNAME_R], [
+
+    AC_LANG_PUSH([C])
+    AC_MSG_CHECKING([how many arguments gethostbyname_r() takes])
+
+    AC_CACHE_VAL([ac_cv_func_which_gethostbyname_r], [
+
+################################################################
+
+ac_cv_func_which_gethostbyname_r=unknown
+
+#
+# ONE ARGUMENT (sanity check)
+#
+
+# This should fail, as there is no variant of gethostbyname_r() that takes
+# a single argument. If it actually compiles, then we can assume that
+# netdb.h is not declaring the function, and the compiler is thereby
+# assuming an implicit prototype. In which case, we're out of luck.
+#
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <netdb.h>],
+        [
+            char *name = "www.gnu.org";
+            (void)gethostbyname_r(name) /* ; */
+        ])],
+    [ac_cv_func_which_gethostbyname_r=no])
+
+#
+# SIX ARGUMENTS
+# (e.g. Linux)
+#
+
+if test "$ac_cv_func_which_gethostbyname_r" = "unknown"; then
+
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <netdb.h>],
+        [
+            char *name = "www.gnu.org";
+            struct hostent ret, *retp;
+            char buf@<:@1024@:>@;
+            int buflen = 1024;
+            int my_h_errno;
+            (void)gethostbyname_r(name, &ret, buf, buflen, &retp, &my_h_errno) /* ; */
+        ])],
+    [ac_cv_func_which_gethostbyname_r=six])
+
+fi
+
+#
+# FIVE ARGUMENTS
+# (e.g. Solaris)
+#
+
+if test "$ac_cv_func_which_gethostbyname_r" = "unknown"; then
+
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <netdb.h>],
+        [
+            char *name = "www.gnu.org";
+            struct hostent ret;
+            char buf@<:@1024@:>@;
+            int buflen = 1024;
+            int my_h_errno;
+            (void)gethostbyname_r(name, &ret, buf, buflen, &my_h_errno) /* ; */
+        ])],
+    [ac_cv_func_which_gethostbyname_r=five])
+
+fi
+
+#
+# THREE ARGUMENTS
+# (e.g. AIX, HP-UX, Tru64)
+#
+
+if test "$ac_cv_func_which_gethostbyname_r" = "unknown"; then
+
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <netdb.h>],
+        [
+            char *name = "www.gnu.org";
+            struct hostent ret;
+            struct hostent_data data;
+            (void)gethostbyname_r(name, &ret, &data) /* ; */
+        ])],
+    [ac_cv_func_which_gethostbyname_r=three])
+
+fi
+
+################################################################
+
+]) dnl end AC_CACHE_VAL
+
+case "$ac_cv_func_which_gethostbyname_r" in
+    three|five|six)
+    AC_DEFINE([HAVE_GETHOSTBYNAME_R], [1],
+              [Define to 1 if you have some form of gethostbyname_r().])
+    ;;
+esac
+
+case "$ac_cv_func_which_gethostbyname_r" in
+    three)
+    AC_MSG_RESULT([three])
+    AC_DEFINE([HAVE_FUNC_GETHOSTBYNAME_R_3], [1],
+              [Define to 1 if you have the three-argument form of gethostbyname_r().])
+    ;;
+
+    five)
+    AC_MSG_RESULT([five])
+    AC_DEFINE([HAVE_FUNC_GETHOSTBYNAME_R_5], [1],
+              [Define to 1 if you have the five-argument form of gethostbyname_r().])
+    ;;
+
+    six)
+    AC_MSG_RESULT([six])
+    AC_DEFINE([HAVE_FUNC_GETHOSTBYNAME_R_6], [1],
+              [Define to 1 if you have the six-argument form of gethostbyname_r().])
+    ;;
+
+    no)
+    AC_MSG_RESULT([cannot find function declaration in netdb.h])
+    ;;
+
+    unknown)
+    AC_MSG_RESULT([can't tell])
+    ;;
+
+    *)
+    AC_MSG_ERROR([internal error])
+    ;;
+esac
+
+AC_LANG_POP
+
+]) dnl end AC_DEFUN

+ 3 - 0
EVSE/GPL/php-7.3.28/TSRM/readdir.h

@@ -0,0 +1,3 @@
+/* Keep this header for compatibility with external code, it's currently not
+	used anywhere in the core and there are no implementations in TSRM. */
+#include "win32/readdir.h"

+ 165 - 0
EVSE/GPL/php-7.3.28/TSRM/threads.m4

@@ -0,0 +1,165 @@
+dnl  Copyright (c) 1999, 2000 Sascha Schumann. All rights reserved.
+dnl
+dnl  Redistribution and use in source and binary forms, with or without
+dnl  modification, are permitted provided that the following conditions
+dnl  are met:
+dnl
+dnl  1. Redistributions of source code must retain the above copyright
+dnl     notice, this list of conditions and the following disclaimer.
+dnl
+dnl  2. Redistributions in binary form must reproduce the above copyright
+dnl     notice, this list of conditions and the following disclaimer in
+dnl     the documentation and/or other materials provided with the
+dnl     distribution.
+dnl
+dnl  THIS SOFTWARE IS PROVIDED BY SASCHA SCHUMANN ``AS IS'' AND ANY
+dnl  EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+dnl  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+dnl  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL SASCHA SCHUMANN OR
+dnl  HIS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+dnl  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+dnl  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+dnl  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+dnl  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+dnl  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+dnl  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+dnl  OF THE POSSIBILITY OF SUCH DAMAGE.
+
+dnl
+dnl PTHREADS_FLAGS
+dnl
+dnl Set some magic defines to achieve POSIX threads conformance
+dnl
+AC_DEFUN([PTHREADS_FLAGS],[
+  if test -z "$host_alias" && test -n "$host"; then
+    host_alias=$host
+  fi
+  if test -z "$host_alias"; then
+    AC_MSG_ERROR(host_alias is not set. Make sure to run config.guess)
+  fi
+  case $host_alias in
+  *solaris*)
+    PTHREAD_FLAGS="-D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT";;
+  *freebsd*)
+    PTHREAD_FLAGS="-D_REENTRANT -D_THREAD_SAFE";;
+  *linux*)
+    PTHREAD_FLAGS=-D_REENTRANT;;
+  *aix*)
+    PTHREAD_FLAGS=-D_THREAD_SAFE;;
+  *irix*)
+    PTHREAD_FLAGS=-D_POSIX_THREAD_SAFE_FUNCTIONS;;
+  *hpux*)
+    PTHREAD_FLAGS=-D_REENTRANT;;
+  *sco*)
+    PTHREAD_FLAGS=-D_REENTRANT;;
+dnl Solves sigwait() problem, creates problems with u_long etc.
+dnl    PTHREAD_FLAGS="-D_REENTRANT -D_XOPEN_SOURCE=500 -D_POSIX_C_SOURCE=199506 -D_XOPEN_SOURCE_EXTENDED=1";;
+  esac
+
+  if test -n "$PTHREAD_FLAGS"; then
+    CPPFLAGS="$CPPFLAGS $PTHREAD_FLAGS"
+  fi
+])dnl
+dnl
+dnl PTHREADS_CHECK_COMPILE
+dnl
+dnl Check whether the current setup can use POSIX threads calls
+dnl
+AC_DEFUN([PTHREADS_CHECK_COMPILE], [
+AC_LINK_IFELSE([ AC_LANG_SOURCE([
+#include <pthread.h>
+#include <stddef.h>
+
+void *thread_routine(void *data) {
+    return data;
+}
+
+int main() {
+    pthread_t thd;
+    pthread_mutexattr_t mattr;
+    int data = 1;
+    pthread_mutexattr_init(&mattr);
+    return pthread_create(&thd, NULL, thread_routine, &data);
+} ]) ], [
+  pthreads_checked=yes
+  ], [
+  pthreads_checked=no
+  ]
+) ] )dnl
+dnl
+dnl PTHREADS_CHECK()
+dnl
+dnl Try to find a way to enable POSIX threads
+dnl
+dnl  Magic flags
+dnl  -kthread          gcc (FreeBSD)
+dnl  -Kthread          UDK cc (UnixWare)
+dnl  -mt               WorkShop cc (Solaris)
+dnl  -mthreads         gcc (AIX)
+dnl  -pthread          gcc (Linux, FreeBSD, NetBSD, OpenBSD)
+dnl  -pthreads         gcc (Solaris)
+dnl  -qthreaded        AIX cc V5
+dnl  -threads          gcc (HP-UX)
+dnl
+AC_DEFUN([PTHREADS_CHECK],[
+
+save_CFLAGS=$CFLAGS
+save_LIBS=$LIBS
+PTHREADS_ASSIGN_VARS
+PTHREADS_CHECK_COMPILE
+LIBS=$save_LIBS
+CFLAGS=$save_CFLAGS
+
+AC_CACHE_CHECK(for pthreads_cflags,ac_cv_pthreads_cflags,[
+ac_cv_pthreads_cflags=
+if test "$pthreads_working" != "yes"; then
+  for flag in -kthread -pthread -pthreads -mthreads -Kthread -threads -mt -qthreaded; do
+    ac_save=$CFLAGS
+    CFLAGS="$CFLAGS $flag"
+    PTHREADS_CHECK_COMPILE
+    CFLAGS=$ac_save
+    if test "$pthreads_checked" = "yes"; then
+      ac_cv_pthreads_cflags=$flag
+      break
+    fi
+  done
+fi
+])
+
+AC_CACHE_CHECK(for pthreads_lib, ac_cv_pthreads_lib,[
+ac_cv_pthreads_lib=
+if test "$pthreads_working" != "yes"; then
+ for lib in pthread pthreads c_r; do
+    ac_save=$LIBS
+    LIBS="$LIBS -l$lib"
+    PTHREADS_CHECK_COMPILE
+    LIBS=$ac_save
+    if test "$pthreads_checked" = "yes"; then
+      ac_cv_pthreads_lib=$lib
+      break
+    fi
+  done
+fi
+])
+
+if test "x$ac_cv_pthreads_cflags" != "x" -o "x$ac_cv_pthreads_lib" != "x"; then
+  pthreads_working="yes"
+fi
+
+if test "$pthreads_working" = "yes"; then
+  threads_result="POSIX-Threads found"
+else
+  threads_result="POSIX-Threads not found"
+fi
+])dnl
+dnl
+dnl
+AC_DEFUN([PTHREADS_ASSIGN_VARS],[
+if test -n "$ac_cv_pthreads_lib"; then
+  LIBS="$LIBS -l$ac_cv_pthreads_lib"
+fi
+
+if test -n "$ac_cv_pthreads_cflags"; then
+  CFLAGS="$CFLAGS $ac_cv_pthreads_cflags"
+fi
+])dnl

+ 106 - 0
EVSE/GPL/php-7.3.28/TSRM/tsrm.m4

@@ -0,0 +1,106 @@
+m4_include([TSRM/m4/ax_func_which_gethostbyname_r.m4])
+
+AC_DEFUN([TSRM_BASIC_CHECKS],[
+
+AC_REQUIRE([AC_PROG_CC])dnl
+dnl AC_REQUIRE([AM_PROG_CC_STDC])dnl
+AC_REQUIRE([AC_PROG_CC_C_O])dnl
+AC_REQUIRE([AC_PROG_RANLIB])dnl
+
+AC_CHECK_HEADERS(stdarg.h)
+
+AC_CHECK_FUNCS(sigprocmask)
+
+AX_FUNC_WHICH_GETHOSTBYNAME_R()
+
+])
+
+
+AC_DEFUN([TSRM_CHECK_PTH],[
+
+AC_MSG_CHECKING(for GNU Pth)
+PTH_PREFIX="`$1 --prefix`"
+if test -z "$PTH_PREFIX"; then
+  AC_MSG_RESULT(Please check your Pth installation)
+fi
+
+CPPFLAGS="$CPPFLAGS `$1 --cflags`"
+LDFLAGS="$LDFLAGS `$1 --ldflags`"
+LIBS="$LIBS `$1 --libs`"
+
+AC_DEFINE(GNUPTH, 1, [Whether you use GNU Pth])
+AC_MSG_RESULT(yes - installed in $PTH_PREFIX)
+
+])
+
+AC_DEFUN([TSRM_CHECK_ST],[
+  if test -r "$1/include/st.h"; then
+    CPPFLAGS="$CPPFLAGS -I$1/include"
+    LDFLAGS="$LDFLAGS -L$1/lib"
+  elif test -r "$1/st.h"; then
+    CPPFLAGS="$CPPFLAGS -I$1"
+    LDFLAGS="$LDFLAGS -L$1"
+  fi
+  AC_CHECK_HEADERS(st.h,[],[
+    AC_MSG_ERROR([Sorry[,] I was unable to locate the State Threads header file.  Please specify the prefix using --with-tsrm-st=/prefix])
+  ])
+  LIBS="$LIBS -lst"
+  AC_MSG_CHECKING(for SGI's State Threads)
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(TSRM_ST, 1, [ ])
+])
+
+sinclude(threads.m4)
+
+AC_DEFUN([TSRM_CHECK_PTHREADS],[
+
+PTHREADS_CHECK
+
+if test "$pthreads_working" != "yes"; then
+  AC_MSG_ERROR(Your system seems to lack POSIX threads.)
+fi
+
+AC_DEFINE(PTHREADS, 1, Whether to use Pthreads)
+
+AC_MSG_CHECKING(for POSIX threads)
+AC_MSG_RESULT(yes)
+])
+
+AC_DEFUN([TSRM_THREADS_CHECKS],[
+
+dnl For the thread implementations, we always use --with-*
+dnl to maintain consistency
+
+AC_ARG_WITH(tsrm-pth,
+[  --with-tsrm-pth[=pth-config]
+                          Use GNU Pth],[
+  TSRM_PTH=$withval
+],[
+  TSRM_PTH=no
+])
+
+AC_ARG_WITH(tsrm-st,
+[  --with-tsrm-st          Use SGI's State Threads],[
+  TSRM_ST=$withval
+],[
+  TSRM_ST=no
+])
+
+AC_ARG_WITH(tsrm-pthreads,
+[  --with-tsrm-pthreads    Use POSIX threads (default)],[
+  TSRM_PTHREADS=$withval
+],[
+  TSRM_PTHREADS=yes
+])
+
+test "$TSRM_PTH" = "yes" && TSRM_PTH=pth-config
+
+if test "$TSRM_PTH" != "no"; then
+  TSRM_CHECK_PTH($TSRM_PTH)
+elif test "$TSRM_ST" != "no"; then
+  TSRM_CHECK_ST($TSRM_ST)
+elif test "$TSRM_PTHREADS" != "no"; then
+  TSRM_CHECK_PTHREADS
+fi
+
+])

+ 23 - 0
EVSE/GPL/php-7.3.28/TSRM/tsrm_config.w32.h

@@ -0,0 +1,23 @@
+#ifndef TSRM_CONFIG_W32_H
+#define TSRM_CONFIG_W32_H
+
+#include <../main/config.w32.h>
+#include "Zend/zend_config.w32.h"
+
+#define HAVE_UTIME 1
+#define HAVE_ALLOCA 1
+
+#include <malloc.h>
+#include <stdlib.h>
+#include <crtdbg.h>
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */

+ 80 - 0
EVSE/GPL/php-7.3.28/TSRM/tsrm_config_common.h

@@ -0,0 +1,80 @@
+#ifndef TSRM_CONFIG_COMMON_H
+#define TSRM_CONFIG_COMMON_H
+
+#ifndef __CYGWIN__
+# ifdef _WIN32
+#  define TSRM_WIN32
+# endif
+#endif
+
+#ifdef TSRM_WIN32
+# include "tsrm_config.w32.h"
+#else
+# include <tsrm_config.h>
+# include <sys/param.h>
+#endif
+
+#if HAVE_ALLOCA_H && !defined(_ALLOCA_H)
+#  include <alloca.h>
+#endif
+
+/* AIX requires this to be the first thing in the file.  */
+#ifndef __GNUC__
+# ifndef HAVE_ALLOCA_H
+#  ifdef _AIX
+#pragma alloca
+#  else
+#   ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+#   endif
+#  endif
+# endif
+#endif
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#if HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#ifndef MAXPATHLEN
+# if _WIN32
+#  include "win32/ioutil.h"
+#  define MAXPATHLEN PHP_WIN32_IOUTIL_MAXPATHLEN
+# elif PATH_MAX
+#  define MAXPATHLEN PATH_MAX
+# elif defined(MAX_PATH)
+#  define MAXPATHLEN MAX_PATH
+# else
+#  define MAXPATHLEN 256
+# endif
+#endif
+
+#if (HAVE_ALLOCA || (defined (__GNUC__) && __GNUC__ >= 2))
+# define TSRM_ALLOCA_MAX_SIZE 4096
+# define TSRM_ALLOCA_FLAG(name) \
+	int name;
+# define tsrm_do_alloca_ex(size, limit, use_heap) \
+	((use_heap = ((size) > (limit))) ? malloc(size) : alloca(size))
+# define tsrm_do_alloca(size, use_heap) \
+	tsrm_do_alloca_ex(size, TSRM_ALLOCA_MAX_SIZE, use_heap)
+# define tsrm_free_alloca(p, use_heap) \
+	do { if (use_heap) free(p); } while (0)
+#else
+# define TSRM_ALLOCA_FLAG(name)
+# define tsrm_do_alloca(p, use_heap)	malloc(p)
+# define tsrm_free_alloca(p, use_heap)	free(p)
+#endif
+
+#endif /* TSRM_CONFIG_COMMON_H */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */

+ 72 - 0
EVSE/GPL/php-7.3.28/TSRM/tsrm_strtok_r.c

@@ -0,0 +1,72 @@
+#include <stdio.h>
+
+#include "tsrm_config_common.h"
+#include "tsrm_strtok_r.h"
+
+static inline int in_character_class(char ch, const char *delim)
+{/*{{{*/
+	while (*delim) {
+		if (*delim == ch) {
+			return 1;
+		}
+		delim++;
+	}
+	return 0;
+}/*}}}*/
+
+TSRM_API char *tsrm_strtok_r(char *s, const char *delim, char **last)
+{/*{{{*/
+	char *token;
+
+	if (s == NULL) {
+		s = *last;
+	}
+
+	while (*s && in_character_class(*s, delim)) {
+		s++;
+	}
+	if (!*s) {
+		return NULL;
+	}
+
+	token = s;
+
+	while (*s && !in_character_class(*s, delim)) {
+		s++;
+	}
+	if (!*s) {
+		*last = s;
+	} else {
+		*s = '\0';
+		*last = s + 1;
+	}
+	return token;
+}/*}}}*/
+
+#if 0
+
+main()
+{
+	char foo[] = "/foo/bar//\\barbara";
+	char *last;
+	char *token;
+
+	token = tsrm_strtok_r(foo, "/\\", &last);
+	while (token) {
+		printf ("Token = '%s'\n", token);
+		token = tsrm_strtok_r(NULL, "/\\", &last);
+	}
+
+	return 0;
+}
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */

+ 8 - 0
EVSE/GPL/php-7.3.28/TSRM/tsrm_strtok_r.h

@@ -0,0 +1,8 @@
+#ifndef TSRM_STRTOK_R
+#define TSRM_STRTOK_R
+
+#include "TSRM.h"
+
+TSRM_API char *tsrm_strtok_r(char *s, const char *delim, char **last);
+
+#endif

+ 839 - 0
EVSE/GPL/php-7.3.28/TSRM/tsrm_win32.c

@@ -0,0 +1,839 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 7                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2018 The PHP Group                                |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 3.01 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | http://www.php.net/license/3_01.txt                                  |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Authors: Daniel Beulshausen <daniel@php4win.de>                      |
+   +----------------------------------------------------------------------+
+*/
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <io.h>
+#include <process.h>
+#include <time.h>
+#include <errno.h>
+
+#define TSRM_INCLUDE_FULL_WINDOWS_HEADERS
+#include "SAPI.h"
+#include "TSRM.h"
+
+#ifdef TSRM_WIN32
+#include <Sddl.h>
+#include "tsrm_win32.h"
+#include "zend_virtual_cwd.h"
+#include "win32/ioutil.h"
+
+#ifdef ZTS
+static ts_rsrc_id win32_globals_id;
+#else
+static tsrm_win32_globals win32_globals;
+#endif
+
+static void tsrm_win32_ctor(tsrm_win32_globals *globals)
+{/*{{{*/
+#ifdef ZTS
+TSRMLS_CACHE_UPDATE();
+#endif
+	globals->process = NULL;
+	globals->shm	 = NULL;
+	globals->process_size = 0;
+	globals->shm_size	  = 0;
+	globals->comspec = _strdup("cmd.exe");
+
+	/* Set it to INVALID_HANDLE_VALUE
+	 * It will be initialized correctly in tsrm_win32_access or set to
+	 * NULL if no impersonation has been done.
+	 * the impersonated token can't be set here as the impersonation
+	 * will happen later, in fcgi_accept_request (or whatever is the
+	 * SAPI being used).
+	 */
+	globals->impersonation_token = INVALID_HANDLE_VALUE;
+	globals->impersonation_token_sid = NULL;
+}/*}}}*/
+
+static void tsrm_win32_dtor(tsrm_win32_globals *globals)
+{/*{{{*/
+	shm_pair *ptr;
+
+	if (globals->process) {
+		free(globals->process);
+	}
+
+	if (globals->shm) {
+		for (ptr = globals->shm; ptr < (globals->shm + globals->shm_size); ptr++) {
+			UnmapViewOfFile(ptr->addr);
+			CloseHandle(ptr->segment);
+			UnmapViewOfFile(ptr->descriptor);
+			CloseHandle(ptr->info);
+		}
+		free(globals->shm);
+	}
+
+	free(globals->comspec);
+
+	if (globals->impersonation_token && globals->impersonation_token != INVALID_HANDLE_VALUE	) {
+		CloseHandle(globals->impersonation_token);
+	}
+	if (globals->impersonation_token_sid) {
+		free(globals->impersonation_token_sid);
+	}
+}/*}}}*/
+
+TSRM_API void tsrm_win32_startup(void)
+{/*{{{*/
+#ifdef ZTS
+	ts_allocate_id(&win32_globals_id, sizeof(tsrm_win32_globals), (ts_allocate_ctor)tsrm_win32_ctor, (ts_allocate_ctor)tsrm_win32_dtor);
+#else
+	tsrm_win32_ctor(&win32_globals);
+#endif
+}/*}}}*/
+
+TSRM_API void tsrm_win32_shutdown(void)
+{/*{{{*/
+#ifndef ZTS
+	tsrm_win32_dtor(&win32_globals);
+#endif
+}/*}}}*/
+
+char * tsrm_win32_get_path_sid_key(const char *pathname, size_t pathname_len, size_t *key_len)
+{/*{{{*/
+	PSID pSid = TWG(impersonation_token_sid);
+	char *ptcSid = NULL;
+	char *bucket_key = NULL;
+	size_t ptc_sid_len;
+
+	if (!pSid) {
+		*key_len = pathname_len;
+		return pathname;
+	}
+
+	if (!ConvertSidToStringSid(pSid, &ptcSid)) {
+		*key_len = 0;
+		return NULL;
+	}
+
+
+	ptc_sid_len = strlen(ptcSid);
+	*key_len = pathname_len + ptc_sid_len;
+	bucket_key = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, *key_len + 1);
+	if (!bucket_key) {
+		LocalFree(ptcSid);
+		*key_len = 0;
+		return NULL;
+	}
+
+	memcpy(bucket_key, ptcSid, ptc_sid_len);
+	memcpy(bucket_key + ptc_sid_len, pathname, pathname_len + 1);
+
+	LocalFree(ptcSid);
+	return bucket_key;
+}/*}}}*/
+
+
+PSID tsrm_win32_get_token_sid(HANDLE hToken)
+{/*{{{*/
+	DWORD dwLength = 0;
+	PTOKEN_USER pTokenUser = NULL;
+	DWORD sid_len;
+	PSID pResultSid = NULL;
+
+	/* Get the actual size of the TokenUser structure */
+	if (!GetTokenInformation(
+			hToken, TokenUser, (LPVOID) pTokenUser, 0, &dwLength))  {
+		if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
+			goto Finished;
+		}
+
+		pTokenUser = (PTOKEN_USER)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwLength);
+		if (pTokenUser == NULL) {
+			goto Finished;
+		}
+	}
+
+	/* and fetch it now */
+	if (!GetTokenInformation(
+		hToken, TokenUser, (LPVOID) pTokenUser, dwLength, &dwLength)) {
+		goto Finished;
+	}
+
+	sid_len = GetLengthSid(pTokenUser->User.Sid);
+
+	/* ConvertSidToStringSid(pTokenUser->User.Sid, &ptcSidOwner); */
+	pResultSid = malloc(sid_len);
+	if (!pResultSid) {
+		goto Finished;
+	}
+	if (!CopySid(sid_len, pResultSid, pTokenUser->User.Sid)) {
+		goto Finished;
+	}
+	HeapFree(GetProcessHeap(), 0, (LPVOID)pTokenUser);
+	return pResultSid;
+
+Finished:
+	if (pResultSid) {
+		free(pResultSid);
+	}
+	/* Free the buffer for the token groups. */
+	if (pTokenUser != NULL) {
+		HeapFree(GetProcessHeap(), 0, (LPVOID)pTokenUser);
+	}
+	return NULL;
+}/*}}}*/
+
+TSRM_API int tsrm_win32_access(const char *pathname, int mode)
+{/*{{{*/
+	time_t t;
+	HANDLE thread_token = NULL;
+	PSID token_sid;
+	SECURITY_INFORMATION sec_info = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;
+	GENERIC_MAPPING gen_map = { FILE_GENERIC_READ, FILE_GENERIC_WRITE, FILE_GENERIC_EXECUTE, FILE_ALL_ACCESS };
+	DWORD priv_set_length = sizeof(PRIVILEGE_SET);
+
+	PRIVILEGE_SET privilege_set = {0};
+	DWORD sec_desc_length = 0, desired_access = 0, granted_access = 0;
+	BYTE * psec_desc = NULL;
+	BOOL fAccess = FALSE;
+
+	realpath_cache_bucket * bucket = NULL;
+	char real_path[MAXPATHLEN] = {0};
+
+	if(!IS_ABSOLUTE_PATH(pathname, strlen(pathname)+1)) {
+		if(tsrm_realpath(pathname, real_path) == NULL) {
+			SET_ERRNO_FROM_WIN32_CODE(ERROR_FILE_NOT_FOUND);
+			return -1;
+		}
+		pathname = real_path;
+	}
+
+	PHP_WIN32_IOUTIL_INIT_W(pathname)
+	if (!pathw) {
+		return -1;
+	}
+
+	/* Either access call failed, or the mode was asking for a specific check.*/
+	int ret = php_win32_ioutil_access_w(pathw, mode);
+	if (0 > ret || X_OK == mode || F_OK == mode) {
+		PHP_WIN32_IOUTIL_CLEANUP_W()
+		return ret;
+	}
+
+/* Only in NTS when impersonate==1 (aka FastCGI) */
+
+	/*
+	 AccessCheck() requires an impersonation token.  We first get a primary
+	 token and then create a duplicate impersonation token.  The
+	 impersonation token is not actually assigned to the thread, but is
+	 used in the call to AccessCheck.  Thus, this function itself never
+	 impersonates, but does use the identity of the thread.  If the thread
+	 was impersonating already, this function uses that impersonation context.
+	*/
+	if(!OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, TRUE, &thread_token)) {
+		if (GetLastError() == ERROR_NO_TOKEN) {
+			if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &thread_token)) {
+				 TWG(impersonation_token) = NULL;
+				 goto Finished;
+			 }
+		}
+	}
+
+	/* token_sid will be freed in tsrmwin32_dtor */
+	token_sid = tsrm_win32_get_token_sid(thread_token);
+	if (!token_sid) {
+		if (TWG(impersonation_token_sid)) {
+			free(TWG(impersonation_token_sid));
+		}
+		TWG(impersonation_token_sid) = NULL;
+		goto Finished;
+	}
+
+	/* Different identity, we need a new impersontated token as well */
+	if (!TWG(impersonation_token_sid) || !EqualSid(token_sid, TWG(impersonation_token_sid))) {
+		if (TWG(impersonation_token_sid)) {
+			free(TWG(impersonation_token_sid));
+		}
+		TWG(impersonation_token_sid) = token_sid;
+
+		/* Duplicate the token as impersonated token */
+		if (!DuplicateToken(thread_token, SecurityImpersonation, &TWG(impersonation_token))) {
+			goto Finished;
+		}
+	} else {
+		/* we already have it, free it then */
+		free(token_sid);
+	}
+
+	if (CWDG(realpath_cache_size_limit)) {
+		t = time(0);
+		bucket = realpath_cache_lookup(pathname, strlen(pathname), t);
+		if(bucket == NULL && !real_path[0]) {
+			/* We used the pathname directly. Call tsrm_realpath */
+			/* so that entry is created in realpath cache */
+			if(tsrm_realpath(pathname, real_path) != NULL) {
+				pathname = real_path;
+				bucket = realpath_cache_lookup(pathname, strlen(pathname), t);
+				PHP_WIN32_IOUTIL_REINIT_W(pathname);
+			}
+		}
+	}
+
+	/* Do a full access check because access() will only check read-only attribute */
+	if(mode == 0 || mode > 6) {
+		if(bucket != NULL && bucket->is_rvalid) {
+			fAccess = bucket->is_readable;
+			goto Finished;
+		}
+		desired_access = FILE_GENERIC_READ;
+	} else if(mode <= 2) {
+		if(bucket != NULL && bucket->is_wvalid) {
+			fAccess = bucket->is_writable;
+			goto Finished;
+		}
+		desired_access = FILE_GENERIC_WRITE;
+	} else if(mode <= 4) {
+		if(bucket != NULL && bucket->is_rvalid) {
+			fAccess = bucket->is_readable;
+			goto Finished;
+		}
+		desired_access = FILE_GENERIC_READ|FILE_FLAG_BACKUP_SEMANTICS;
+	} else { // if(mode <= 6)
+		if(bucket != NULL && bucket->is_rvalid && bucket->is_wvalid) {
+			fAccess = bucket->is_readable & bucket->is_writable;
+			goto Finished;
+		}
+		desired_access = FILE_GENERIC_READ | FILE_GENERIC_WRITE;
+	}
+
+	if(TWG(impersonation_token) == NULL) {
+		goto Finished;
+	}
+
+	/* Get size of security buffer. Call is expected to fail */
+	if(GetFileSecurityW(pathw, sec_info, NULL, 0, &sec_desc_length)) {
+		goto Finished;
+	}
+
+	psec_desc = (BYTE *)malloc(sec_desc_length);
+	if(psec_desc == NULL ||
+		 !GetFileSecurityW(pathw, sec_info, (PSECURITY_DESCRIPTOR)psec_desc, sec_desc_length, &sec_desc_length)) {
+		goto Finished;
+	}
+
+	MapGenericMask(&desired_access, &gen_map);
+
+	if(!AccessCheck((PSECURITY_DESCRIPTOR)psec_desc, TWG(impersonation_token), desired_access, &gen_map, &privilege_set, &priv_set_length, &granted_access, &fAccess)) {
+		goto Finished_Impersonate;
+	}
+
+	/* Keep the result in realpath_cache */
+	if(bucket != NULL) {
+		if(desired_access == (FILE_GENERIC_READ|FILE_FLAG_BACKUP_SEMANTICS)) {
+			bucket->is_rvalid = 1;
+			bucket->is_readable = fAccess;
+		}
+		else if(desired_access == FILE_GENERIC_WRITE) {
+			bucket->is_wvalid = 1;
+			bucket->is_writable = fAccess;
+		} else if (desired_access == (FILE_GENERIC_READ | FILE_GENERIC_WRITE)) {
+			bucket->is_rvalid = 1;
+			bucket->is_readable = fAccess;
+			bucket->is_wvalid = 1;
+			bucket->is_writable = fAccess;
+		}
+	}
+
+Finished_Impersonate:
+	if(psec_desc != NULL) {
+		free(psec_desc);
+		psec_desc = NULL;
+	}
+
+Finished:
+	if(thread_token != NULL) {
+		CloseHandle(thread_token);
+	}
+
+	PHP_WIN32_IOUTIL_CLEANUP_W()
+	if(fAccess == FALSE) {
+		errno = EACCES;
+		return errno;
+	} else {
+		return 0;
+	}
+}/*}}}*/
+
+
+static process_pair *process_get(FILE *stream)
+{/*{{{*/
+	process_pair *ptr;
+	process_pair *newptr;
+
+	for (ptr = TWG(process); ptr < (TWG(process) + TWG(process_size)); ptr++) {
+		if (ptr->stream == stream) {
+			break;
+		}
+	}
+
+	if (ptr < (TWG(process) + TWG(process_size))) {
+		return ptr;
+	}
+
+	newptr = (process_pair*)realloc((void*)TWG(process), (TWG(process_size)+1)*sizeof(process_pair));
+	if (newptr == NULL) {
+		return NULL;
+	}
+
+	TWG(process) = newptr;
+	ptr = newptr + TWG(process_size);
+	TWG(process_size)++;
+	return ptr;
+}/*}}}*/
+
+static shm_pair *shm_get(key_t key, void *addr)
+{/*{{{*/
+	shm_pair *ptr;
+	shm_pair *newptr;
+
+	for (ptr = TWG(shm); ptr < (TWG(shm) + TWG(shm_size)); ptr++) {
+		if (!ptr->descriptor) {
+			continue;
+		}
+		if (!addr && ptr->descriptor->shm_perm.key == key) {
+			break;
+		} else if (ptr->addr == addr) {
+			break;
+		}
+	}
+
+	if (ptr < (TWG(shm) + TWG(shm_size))) {
+		return ptr;
+	}
+
+	newptr = (shm_pair*)realloc((void*)TWG(shm), (TWG(shm_size)+1)*sizeof(shm_pair));
+	if (newptr == NULL) {
+		return NULL;
+	}
+
+	TWG(shm) = newptr;
+	ptr = newptr + TWG(shm_size);
+	TWG(shm_size)++;
+	memset(ptr, 0, sizeof(*ptr));
+	return ptr;
+}/*}}}*/
+
+static HANDLE dupHandle(HANDLE fh, BOOL inherit)
+{/*{{{*/
+	HANDLE copy, self = GetCurrentProcess();
+	if (!DuplicateHandle(self, fh, self, &copy, 0, inherit, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE)) {
+		return NULL;
+	}
+	return copy;
+}/*}}}*/
+
+TSRM_API FILE *popen(const char *command, const char *type)
+{/*{{{*/
+
+	return popen_ex(command, type, NULL, NULL);
+}/*}}}*/
+
+TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, char *env)
+{/*{{{*/
+	FILE *stream = NULL;
+	int fno, type_len, read, mode;
+	STARTUPINFOW startup;
+	PROCESS_INFORMATION process;
+	SECURITY_ATTRIBUTES security;
+	HANDLE in, out;
+	DWORD dwCreateFlags = 0;
+	BOOL res;
+	process_pair *proc;
+	char *cmd = NULL;
+	wchar_t *cmdw = NULL, *cwdw = NULL, *envw = NULL;
+	int i;
+	char *ptype = (char *)type;
+	HANDLE thread_token = NULL;
+	HANDLE token_user = NULL;
+	BOOL asuser = TRUE;
+
+	if (!type) {
+		return NULL;
+	}
+
+	/*The following two checks can be removed once we drop XP support */
+	type_len = (int)strlen(type);
+	if (type_len <1 || type_len > 2) {
+		return NULL;
+	}
+
+	for (i=0; i < type_len; i++) {
+		if (!(*ptype == 'r' || *ptype == 'w' || *ptype == 'b' || *ptype == 't')) {
+			return NULL;
+		}
+		ptype++;
+	}
+
+	cmd = (char*)malloc(strlen(command)+strlen(TWG(comspec))+sizeof(" /c ")+2);
+	if (!cmd) {
+		return NULL;
+	}
+
+	sprintf(cmd, "%s /c \"%s\"", TWG(comspec), command);
+	cmdw = php_win32_cp_any_to_w(cmd);
+	if (!cmdw) {
+		free(cmd);
+		return NULL;
+	}
+
+	if (cwd) {
+		cwdw = php_win32_ioutil_any_to_w(cwd);
+		if (!cwdw) {
+			free(cmd);
+			free(cmdw);
+			return NULL;
+		}
+	}
+
+	security.nLength				= sizeof(SECURITY_ATTRIBUTES);
+	security.bInheritHandle			= TRUE;
+	security.lpSecurityDescriptor	= NULL;
+
+	if (!type_len || !CreatePipe(&in, &out, &security, 2048L)) {
+		free(cmdw);
+		free(cwdw);
+		free(cmd);
+		return NULL;
+	}
+
+	memset(&startup, 0, sizeof(STARTUPINFOW));
+	memset(&process, 0, sizeof(PROCESS_INFORMATION));
+
+	startup.cb			= sizeof(STARTUPINFOW);
+	startup.dwFlags		= STARTF_USESTDHANDLES;
+	startup.hStdError	= GetStdHandle(STD_ERROR_HANDLE);
+
+	read = (type[0] == 'r') ? TRUE : FALSE;
+	mode = ((type_len == 2) && (type[1] == 'b')) ? O_BINARY : O_TEXT;
+
+	if (read) {
+		in = dupHandle(in, FALSE);
+		startup.hStdInput  = GetStdHandle(STD_INPUT_HANDLE);
+		startup.hStdOutput = out;
+	} else {
+		out = dupHandle(out, FALSE);
+		startup.hStdInput  = in;
+		startup.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
+	}
+
+	dwCreateFlags = NORMAL_PRIORITY_CLASS;
+	if (strcmp(sapi_module.name, "cli") != 0) {
+		dwCreateFlags |= CREATE_NO_WINDOW;
+	}
+
+	/* Get a token with the impersonated user. */
+	if(OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, TRUE, &thread_token)) {
+		DuplicateTokenEx(thread_token, MAXIMUM_ALLOWED, &security, SecurityImpersonation, TokenPrimary, &token_user);
+	} else {
+		DWORD err = GetLastError();
+		if (err == ERROR_NO_TOKEN) {
+			asuser = FALSE;
+		}
+	}
+
+	envw = php_win32_cp_env_any_to_w(env);
+	if (envw) {
+		dwCreateFlags |= CREATE_UNICODE_ENVIRONMENT;
+	} else {
+		if (env) {
+			free(cmd);
+			free(cmdw);
+			free(cwdw);
+			return NULL;
+		}
+	}
+
+	if (asuser) {
+		res = CreateProcessAsUserW(token_user, NULL, cmdw, &security, &security, security.bInheritHandle, dwCreateFlags, envw, cwdw, &startup, &process);
+		CloseHandle(token_user);
+	} else {
+		res = CreateProcessW(NULL, cmdw, &security, &security, security.bInheritHandle, dwCreateFlags, envw, cwdw, &startup, &process);
+	}
+	free(cmd);
+	free(cmdw);
+	free(cwdw);
+	free(envw);
+
+	if (!res) {
+		return NULL;
+	}
+
+	CloseHandle(process.hThread);
+	proc = process_get(NULL);
+
+	if (read) {
+		fno = _open_osfhandle((tsrm_intptr_t)in, _O_RDONLY | mode);
+		CloseHandle(out);
+	} else {
+		fno = _open_osfhandle((tsrm_intptr_t)out, _O_WRONLY | mode);
+		CloseHandle(in);
+	}
+
+	stream = _fdopen(fno, type);
+	proc->prochnd = process.hProcess;
+	proc->stream = stream;
+	return stream;
+}/*}}}*/
+
+TSRM_API int pclose(FILE *stream)
+{/*{{{*/
+	DWORD termstat = 0;
+	process_pair *process;
+
+	if ((process = process_get(stream)) == NULL) {
+		return 0;
+	}
+
+	fflush(process->stream);
+	fclose(process->stream);
+
+	WaitForSingleObject(process->prochnd, INFINITE);
+	GetExitCodeProcess(process->prochnd, &termstat);
+	process->stream = NULL;
+	CloseHandle(process->prochnd);
+
+	return termstat;
+}/*}}}*/
+
+TSRM_API int shmget(key_t key, size_t size, int flags)
+{/*{{{*/
+	shm_pair *shm;
+	char shm_segment[26], shm_info[29];
+	HANDLE shm_handle = NULL, info_handle = NULL;
+	BOOL created = FALSE;
+
+	if (key != IPC_PRIVATE) {
+		snprintf(shm_segment, sizeof(shm_segment), "TSRM_SHM_SEGMENT:%d", key);
+		snprintf(shm_info, sizeof(shm_info), "TSRM_SHM_DESCRIPTOR:%d", key);
+
+		shm_handle  = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_segment);
+		info_handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, shm_info);
+	}
+
+	if (!shm_handle && !info_handle) {
+		if (flags & IPC_CREAT) {
+#if SIZEOF_SIZE_T == 8
+			DWORD high = size >> 32;
+			DWORD low = (DWORD)size;
+#else
+			DWORD high = 0;
+			DWORD low = size;
+#endif
+			shm_handle	= CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, high, low, key == IPC_PRIVATE ? NULL : shm_segment);
+			info_handle	= CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(shm->descriptor), key == IPC_PRIVATE ? NULL : shm_info);
+			created		= TRUE;
+		}
+		if (!shm_handle || !info_handle) {
+			if (shm_handle) {
+				CloseHandle(shm_handle);
+			}
+			if (info_handle) {
+				CloseHandle(info_handle);
+			}
+			return -1;
+		}
+	} else {
+		if (flags & IPC_EXCL) {
+			if (shm_handle) {
+				CloseHandle(shm_handle);
+			}
+			if (info_handle) {
+				CloseHandle(info_handle);
+			}
+			return -1;
+		}
+	}
+
+	shm = shm_get(key, NULL);
+	if (!shm) {
+		CloseHandle(shm_handle);
+		CloseHandle(info_handle);
+		return -1;
+	}
+	shm->segment = shm_handle;
+	shm->info	 = info_handle;
+	shm->descriptor = MapViewOfFileEx(shm->info, FILE_MAP_ALL_ACCESS, 0, 0, 0, NULL);
+
+	if (NULL != shm->descriptor && created) {
+		shm->descriptor->shm_perm.key	= key;
+		shm->descriptor->shm_segsz		= size;
+		shm->descriptor->shm_ctime		= time(NULL);
+		shm->descriptor->shm_cpid		= getpid();
+		shm->descriptor->shm_perm.mode	= flags;
+
+		shm->descriptor->shm_perm.cuid	= shm->descriptor->shm_perm.cgid= 0;
+		shm->descriptor->shm_perm.gid	= shm->descriptor->shm_perm.uid = 0;
+		shm->descriptor->shm_atime		= shm->descriptor->shm_dtime	= 0;
+		shm->descriptor->shm_lpid		= shm->descriptor->shm_nattch	= 0;
+		shm->descriptor->shm_perm.mode	= shm->descriptor->shm_perm.seq	= 0;
+	}
+
+	if (NULL != shm->descriptor && (shm->descriptor->shm_perm.key != key || size > shm->descriptor->shm_segsz)) {
+		if (NULL != shm->segment) {
+			CloseHandle(shm->segment);
+		}
+		UnmapViewOfFile(shm->descriptor);
+		CloseHandle(shm->info);
+		return -1;
+	}
+
+	return key;
+}/*}}}*/
+
+TSRM_API void *shmat(int key, const void *shmaddr, int flags)
+{/*{{{*/
+	shm_pair *shm = shm_get(key, NULL);
+
+	if (!shm->segment) {
+		return (void*)-1;
+	}
+
+	shm->addr = MapViewOfFileEx(shm->segment, FILE_MAP_ALL_ACCESS, 0, 0, 0, NULL);
+
+	if (NULL == shm->addr) {
+		int err = GetLastError();
+		SET_ERRNO_FROM_WIN32_CODE(err);
+		return (void*)-1;
+	}
+
+	shm->descriptor->shm_atime = time(NULL);
+	shm->descriptor->shm_lpid  = getpid();
+	shm->descriptor->shm_nattch++;
+
+	return shm->addr;
+}/*}}}*/
+
+TSRM_API int shmdt(const void *shmaddr)
+{/*{{{*/
+	shm_pair *shm = shm_get(0, (void*)shmaddr);
+	int ret;
+
+	if (!shm->segment) {
+		return -1;
+	}
+
+	shm->descriptor->shm_dtime = time(NULL);
+	shm->descriptor->shm_lpid  = getpid();
+	shm->descriptor->shm_nattch--;
+
+	ret = UnmapViewOfFile(shm->addr) ? 0 : -1;
+	if (!ret  && shm->descriptor->shm_nattch <= 0) {
+		ret = UnmapViewOfFile(shm->descriptor) ? 0 : -1;
+		shm->descriptor = NULL;
+	}
+	return ret;
+}/*}}}*/
+
+TSRM_API int shmctl(int key, int cmd, struct shmid_ds *buf)
+{/*{{{*/
+	shm_pair *shm = shm_get(key, NULL);
+
+	if (!shm->segment) {
+		return -1;
+	}
+
+	switch (cmd) {
+		case IPC_STAT:
+			memcpy(buf, shm->descriptor, sizeof(struct shmid_ds));
+			return 0;
+
+		case IPC_SET:
+			shm->descriptor->shm_ctime		= time(NULL);
+			shm->descriptor->shm_perm.uid	= buf->shm_perm.uid;
+			shm->descriptor->shm_perm.gid	= buf->shm_perm.gid;
+			shm->descriptor->shm_perm.mode	= buf->shm_perm.mode;
+			return 0;
+
+		case IPC_RMID:
+			if (shm->descriptor->shm_nattch < 1) {
+				shm->descriptor->shm_perm.key = -1;
+			}
+			return 0;
+
+		default:
+			return -1;
+	}
+}/*}}}*/
+
+#if HAVE_UTIME
+static zend_always_inline void UnixTimeToFileTime(time_t t, LPFILETIME pft) /* {{{ */
+{
+	// Note that LONGLONG is a 64-bit value
+	LONGLONG ll;
+
+	ll = t * 10000000LL + 116444736000000000LL;
+	pft->dwLowDateTime = (DWORD)ll;
+	pft->dwHighDateTime = ll >> 32;
+}
+/* }}} */
+
+TSRM_API int win32_utime(const char *filename, struct utimbuf *buf) /* {{{ */
+{
+	FILETIME mtime, atime;
+	HANDLE hFile;
+	PHP_WIN32_IOUTIL_INIT_W(filename)
+
+	if (!pathw) {
+		return -1;
+	}
+
+	hFile = CreateFileW(pathw, GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,
+				 OPEN_ALWAYS, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+
+	PHP_WIN32_IOUTIL_CLEANUP_W()
+
+	/* OPEN_ALWAYS mode sets the last error to ERROR_ALREADY_EXISTS but
+	   the CreateFile operation succeeds */
+	if (GetLastError() == ERROR_ALREADY_EXISTS) {
+		SetLastError(0);
+	}
+
+	if ( hFile == INVALID_HANDLE_VALUE ) {
+		return -1;
+	}
+
+	if (!buf) {
+		SYSTEMTIME st;
+		GetSystemTime(&st);
+		SystemTimeToFileTime(&st, &mtime);
+		atime = mtime;
+	} else {
+		UnixTimeToFileTime(buf->modtime, &mtime);
+		UnixTimeToFileTime(buf->actime, &atime);
+	}
+	if (!SetFileTime(hFile, NULL, &atime, &mtime)) {
+		CloseHandle(hFile);
+		return -1;
+	}
+	CloseHandle(hFile);
+	return 1;
+}
+/* }}} */
+#endif
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */

+ 120 - 0
EVSE/GPL/php-7.3.28/TSRM/tsrm_win32.h

@@ -0,0 +1,120 @@
+/*
+   +----------------------------------------------------------------------+
+   | PHP Version 7                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2018 The PHP Group                                |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 3.01 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | http://www.php.net/license/3_01.txt                                  |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Authors: Daniel Beulshausen <daniel@php4win.de>                      |
+   +----------------------------------------------------------------------+
+*/
+
+#ifndef TSRM_WIN32_H
+#define TSRM_WIN32_H
+
+#include "TSRM.h"
+#include <windows.h>
+#if HAVE_UTIME
+# include <sys/utime.h>
+#endif
+#include "win32/ipc.h"
+
+struct ipc_perm {
+	key_t		key;
+	unsigned short	uid;
+	unsigned short	gid;
+	unsigned short	cuid;
+	unsigned short	cgid;
+	unsigned short	mode;
+	unsigned short	seq;
+};
+
+struct shmid_ds {
+	struct	ipc_perm	shm_perm;
+	size_t			shm_segsz;
+	time_t			shm_atime;
+	time_t			shm_dtime;
+	time_t			shm_ctime;
+	unsigned short	shm_cpid;
+	unsigned short	shm_lpid;
+	short			shm_nattch;
+};
+
+typedef struct {
+	FILE	*stream;
+	HANDLE	prochnd;
+} process_pair;
+
+typedef struct {
+	void	*addr;
+	HANDLE	info;
+	HANDLE	segment;
+	struct	shmid_ds	*descriptor;
+} shm_pair;
+
+typedef struct {
+	process_pair	*process;
+	shm_pair		*shm;
+	int				process_size;
+	int				shm_size;
+	char			*comspec;
+	HANDLE impersonation_token;
+	PSID			impersonation_token_sid;
+} tsrm_win32_globals;
+
+#ifdef ZTS
+# define TWG(v) TSRMG_STATIC(win32_globals_id, tsrm_win32_globals *, v)
+TSRMLS_CACHE_EXTERN()
+#else
+# define TWG(v) (win32_globals.v)
+#endif
+
+#define IPC_PRIVATE	0
+#define IPC_CREAT	00001000
+#define IPC_EXCL	00002000
+#define IPC_NOWAIT	00004000
+
+#define IPC_RMID	0
+#define IPC_SET		1
+#define IPC_STAT	2
+#define IPC_INFO	3
+
+#define SHM_R		PAGE_READONLY
+#define SHM_W		PAGE_READWRITE
+
+#define	SHM_RDONLY	FILE_MAP_READ
+#define	SHM_RND		FILE_MAP_WRITE
+#define	SHM_REMAP	FILE_MAP_COPY
+
+char * tsrm_win32_get_path_sid_key(const char *pathname, size_t pathname_len, size_t *key_len);
+
+TSRM_API void tsrm_win32_startup(void);
+TSRM_API void tsrm_win32_shutdown(void);
+
+TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, char *env);
+TSRM_API FILE *popen(const char *command, const char *type);
+TSRM_API int pclose(FILE *stream);
+TSRM_API int tsrm_win32_access(const char *pathname, int mode);
+TSRM_API int win32_utime(const char *filename, struct utimbuf *buf);
+
+TSRM_API int shmget(key_t key, size_t size, int flags);
+TSRM_API void *shmat(int key, const void *shmaddr, int flags);
+TSRM_API int shmdt(const void *shmaddr);
+TSRM_API int shmctl(int key, int cmd, struct shmid_ds *buf);
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */

+ 774 - 0
EVSE/GPL/php-7.3.28/UPGRADING

@@ -0,0 +1,774 @@
+PHP 7.3 UPGRADE NOTES
+
+1. Backward Incompatible Changes
+2. New Features
+3. Changes in SAPI modules
+4. Deprecated Functionality
+5. Changed Functions
+6. New Functions
+7. New Classes and Interfaces
+8. Removed Extensions and SAPIs
+9. Other Changes to Extensions
+10. New Global Constants
+11. Changes to INI File Handling
+12. Windows Support
+13. Other Changes
+
+
+========================================
+1. Backward Incompatible Changes
+========================================
+
+Core:
+  . The ext_skel utility has been completely redesigned with new options and
+    some old options removed. This is now written in PHP and has no external
+    dependencies.
+  . Support for BeOS has been dropped.
+  . Exceptions thrown due to automatic conversion of warnings into exceptions
+    in EH_THROW mode (e.g. some DateTime exceptions) no longer populate
+    error_get_last() state. As such, they now work the same way as manually
+    thrown exceptions.
+  . TypeError now reports wrong types as `int` and `bool` instead of `integer`
+    and `boolean`.
+  . Due to the introduction of flexible heredoc/nowdoc syntax (see New Features
+    section), doc strings that contain the ending label inside their body may
+    cause syntax errors or change in interpretation. For example in
+
+        $str = <<<FOO
+        abcdefg
+            FOO
+        FOO;
+
+    the indented occurrence of "FOO" did not previously have any special
+    meaning. Now it will be interpreted as the end of the heredoc string and
+    the following "FOO;" will cause a syntax error. This issue can always be
+    resolved by choosing an ending label that does not occur within the contents
+    of the string.
+  . "continue" statements targeting "switch" control flow structures will now
+    generate a warning. In PHP such "continue" statements are equivalent to
+    "break", while they behave as "continue 2" in other languages.
+
+        while ($foo) {
+            switch ($bar) {
+                case "baz":
+                    continue;
+                    // Warning: "continue" targeting switch is equivalent to
+                    //          "break". Did you mean to use "continue 2"?
+            }
+        }
+
+  . Array accesses of type $obj["123"], where $obj implements ArrayAccess and
+    "123" is an integer string literal will no longer result in an implicit
+    conversion to integer, i.e., $obj->offsetGet("123") will be called instead
+    of $obj->offsetGet(123). This matches existing behavior for non-literals.
+    The behavior of arrays is not affected in any way, they continue to
+    implicitly convert integeral string keys to integers.
+  . In PHP, static properties are shared between inheriting classes, unless the
+    static property is explicitly overridden in a child class. However, due to
+    an implementation artifact it was possible to separate the static properties
+    by assigning a reference. This loophole has been fixed.
+
+        class Test {
+            public static $x = 0;
+        }
+        class Test2 extends Test { }
+
+        Test2::$x = &$x;
+        $x = 1;
+
+        var_dump(Test::$x, Test2::$x);
+        // Previously: int(0), int(1)
+        // Now:        int(1), int(1)
+
+  . References returned by array and property accesses are now unwrapped as
+    part of the access. This means that it is no longer possible to modify the
+    reference between the access and the use of the accessed value:
+
+        $arr = [1];
+        $ref =& $arr[0];
+        var_dump($arr[0] + ($arr[0] = 2));
+        // Previously: int(4), Now: int(3)
+
+    This makes the behavior of references and non-references consistent. Please
+    note that reading and writing a value inside a single expression remains
+    undefined behavior and may change again in the future.
+
+  . Argument unpacking stopped working with Traversables with non-integer keys.
+    The following code worked in PHP 7.0-7.2 by accident.
+
+        function foo(...$args) {
+            var_dump($args);
+        }
+        function gen() {
+            yield 1.23 => 123;
+        }
+        foo(...gen());
+
+    Now it generates an exception.
+
+BCMath:
+  . All warnings thrown by BCMath functions are now using PHP's error handling.
+    Formerly some warnings have directly been written to stderr.
+  . bcmul() and bcpow() now return numbers with the requested scale. Formerly,
+    the returned numbers may have omitted trailing decimal zeroes.
+
+DOM:
+  . As of PHP 7.3.16, the value of the $childNodes property of DOMDocument,
+    DOMNode, DOMProcessingInstruction, DOMComment, DOMText, DOMCdataSection and
+    DOMNotation is now an empty DOMNodeList instead of NULL, according to the
+    W3C and WHATWG standards and the PHP manual.
+
+IMAP:
+  rsh/ssh logins are disabled by default. Use imap.enable_insecure_rsh if you want
+  to enable them. Note that the IMAP library does not filter mailbox names before
+  passing them to rsh/ssh command, thus passing untrusted data to this function
+  with rsh/ssh enabled is insecure.
+
+MBString:
+  . Due to added support for named captures, mb_ereg_*() patterns using named
+    captures will behave differently. In particular named captures will be part
+    of matches and mb_ereg_replace() will interpret additional syntax. See
+    "New Features" section for more information.
+
+mysqli:
+  . Prepared statements now properly report the fractional seconds for DATETIME/
+    TIME/TIMESTAMP columns with decimals specifier (e.g. TIMESTAMP(6) when using
+    microseconds). Formerly, the fractional seconds part was simply omitted from
+    the returned values.
+
+PDO/MySQL:
+  . Prepared statements now properly report the fractional seconds for DATETIME/
+    TIME/TIMESTAMP columns with decimals specifier (e.g. TIMESTAMP(6) when using
+    microseconds). Formerly, the fractional seconds part was simply omitted from
+    the returned values.
+    Please note that this only affects the usage of PDO_MYSQL with emulated
+    prepares turned off (e.g. using the native preparation functionality).
+    Statements using connections having PDO::ATTR_EMULATE_PREPARES=true (which
+    is the default) were not affected by the bug fixed and have already been
+    getting the proper fractional seconds values from the engine.
+
+Reflection:
+  . Reflection export to string now uses `int` and `bool` instead of `integer`
+    and `boolean`.
+
+- SAPI:
+  . Starting with 7.3.23, incoming cookie names are not url-decoded. This was never 
+    required by the standard, outgoing cookie names aren't encoded and this leads 
+    to security issues (CVE-2020-7070).
+
+SPL:
+  . If an SPL autoloader throws an exception, following autoloaders will not be
+    executed. Previously all autoloaders were executed and exceptions were
+    chained.
+
+SimpleXML:
+  . Mathematic operations involving SimpleXML objects will now treat the text as
+    an integer or float, whichever is more appropriate. Previously values were
+    treated as integers unconditionally.
+
+Standard:
+  . Undefined variables passed to compact() will now be reported as a notice.
+  . getimagesize() and related functions now report the mime type of BMP images
+    as image/bmp instead of image/x-ms-bmp, since the former has been registered
+    with the IANA (see RFC 7903).
+  . stream_socket_get_name() will now return IPv6 addresses wrapped in brackets.
+    For example "[::1]:1337" will be returned instead of "::1:1337".
+
+========================================
+2. New Features
+========================================
+
+Core:
+  . Implemented flexible heredoc and nowdoc syntax: The closing marker for doc
+    strings is no longer required to be followed by a semicolon or newline.
+    Additionally the closing marker may be indented, in which case the
+    indentation will be stripped from all lines in the doc string.
+    (RFC: https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes)
+  . Array destructuring now supports reference assignments using the syntax
+    [&$a, [$b, &$c]] = $d. The same is also supported for list().
+    (RFC: https://wiki.php.net/rfc/list_reference_assignment)
+  . instanceof now allows literals as the first operand,
+    in which case the result is always FALSE.
+  . A new CompileError exception has been added, from which ParseError inherits.
+    A small number of compilation errors will now throw a CompileError instead
+    of generating a fatal error. Currently this only affects compilation errors
+    that may be thrown by token_get_all() in TOKEN_PARSE mode, but more errors
+    may be converted in the future.
+  . Trailing commas in function and method calls are now allowed.
+    (RFC: https://wiki.php.net/rfc/trailing-comma-function-calls)
+
+BCMath:
+  . bcscale() can now also be used as getter to retrieve the current scale in use.
+
+MBString:
+  . Support for full case-mapping and case-folding has been added. Unlike simple
+    case-mapping, full case-mapping may change the length of the string. For
+    example:
+
+      mb_strtoupper("Straße")
+      // Produces STRAßE on PHP 7.2
+      // Produces STRASSE on PHP 7.3
+
+    The different casing mapping and folding modes are available through
+    mb_convert_case():
+
+      . MB_CASE_LOWER (used by mb_strtolower)
+      . MB_CASE_UPPER (used by mb_strtoupper)
+      . MB_CASE_TITLE
+      . MB_CASE_FOLD
+      . MB_CASE_LOWER_SIMPLE
+      . MB_CASE_UPPER_SIMPLE
+      . MB_CASE_TITLE_SIMPLE
+      . MB_CASE_FOLD_SIMPLE (used by case-insensitive operations)
+
+    Only unconditional, language agnostic full case-mapping is performed.
+  . Case-insensitive string operations now use case-folding instead of case-
+    mapping during comparisons. This means that more characters will be
+    considered (case insensitively) equal now.
+  . mb_convert_case() with MB_CASE_TITLE now performs title-case conversion
+    based on the Cased and CaseIgnorable derived Unicode properties. In
+    particular this also improves handling of quotes and apostophes.
+  . Data tables have been updated for Unicode 11.
+  . Mbstring now correctly supports strings larger than 2GB.
+  . Performance of the mbstring extension has been significantly improved
+    across the board. The largest improvements are in case conversion functions.
+  . mb_ereg_*() functions now support named captures. Matching functions like
+    mb_ereg() will now return named captures both using their group number and
+    their name, similar to PCRE:
+
+        mb_ereg('(?<word>\w+)', '国', $matches);
+        // => [0 => "国", 1 => "国", "word" => "国"];
+
+    Additionally, mb_ereg_replace() now supports the \k<> and \k'' notations
+    to reference named captures in the replacement string:
+
+        mb_ereg_replace('\s*(?<word>\w+)\s*', "_\k<word>_\k'word'_", ' foo ');
+        // => "_foo_foo_"
+
+    \k<> and \k'' can also be used for numbered references, which also works
+    with group numbers greater than 9.
+
+readline:
+  . Support for the completion_append_character and completion_suppress_append
+    options has been added to readline_info(). These options are only available
+    if PHP is linked against libreadline (rather than libedit).
+
+Standard:
+  . The --with-password-argon2[=dir] configure argument now provides support for
+    both Argon2i and Argon2id hashes in the password_hash(), password_verify(),
+    password_get_info(), and password_needs_rehash() functions. Passwords may be
+    hashed and verified using the PASSWORD_ARGON2ID constant.
+    Support for both Argon2i and Argon2id in the password_* functions now requires
+    PHP be linked against libargon2 reference library >= 20161029.
+    (RFC: https://wiki.php.net/rfc/argon2_password_hash_enhancements).
+
+LDAP:
+  . Full support for LDAP Controls has been added to LDAP querying functions
+    and ldap_parse_result
+
+========================================
+3. Changes in SAPI modules
+========================================
+
+phpdbg:
+  . The unused constants PHPDBG_FILE, PHPDBG_METHOD, PHPDBG_LINENO and
+    PHPDBG_FUNC have been removed.
+
+FPM:
+  . A new global option log_limit has been added. It can be used for setting
+    log limit for logged line which allows to log messages longer than 1024
+    characters without wrapping. It also fixes various wrapping issues.
+  . A new global option log_buffering has been added. It allows an experimental
+    logging without extra buffering.
+  . A new pool option decorate_workers_output has been added. It allows
+    disabling output decoration for workers output when catch_workers_output
+    enabled.
+  . The getallheaders() function is now also available.
+  . In PHP 7.3.11 a new pool option
+    request_terminate_timeout_track_finished has been added. When enabled,
+    request_terminate_timeout will also apply after fastcgi_finish_request()
+    has been called, as well as during execution of shutdown functions.
+
+========================================
+4. Deprecated Functionality
+========================================
+
+Core:
+  . The declaration of case-insensitive constants has been deprecated. Passing
+    true as the third argument to define() will now generate a deprecation
+    warning. The use of case-insensitive constants with a case that differs from
+    the declaration is also deprecated.
+    (RFC: https://wiki.php.net/rfc/case_insensitive_constant_deprecation)
+  . Declaring a function called assert() inside a namespace is deprecated.
+    The assert() function is subject to special handling by the engine, which
+    may lead to inconsistent behavior when defining a namespaced function with
+    the same name.
+
+Filter:
+  . The explicit usage of the constants FILTER_FLAG_SCHEME_REQUIRED and
+    FILTER_FLAG_HOST_REQUIRED is now deprecated; both are implied for
+    FILTER_VALIDATE_URL anyway.
+
+GD:
+  . image2wbmp() has been deprecated.
+
+Intl:
+  . Usage of the Normalizer::NONE form throws a deprecation warning, if PHP is
+    linked with ICU >= 56.
+
+Mbstring:
+  . The following undocumented mbereg_*() aliases have been deprecated. Use the
+    corresponding mb_ereg_*() variants instead.
+     . mbregex_encoding()
+     . mbereg()
+     . mberegi()
+     . mbereg_replace()
+     . mberegi_replace()
+     . mbsplit()
+     . mbereg_match()
+     . mbereg_search()
+     . mbereg_search_pos()
+     . mbereg_search_regs()
+     . mbereg_search_init()
+     . mbereg_search_getregs()
+     . mbereg_search_getpos()
+     . mbereg_search_setpos()
+
+PDO ODBC:
+  . The pdo_odbc.db2_instance_name ini setting has been formally deprecated. It
+    has already been deprecated in the documentation since PHP 5.1.1.
+
+Standard:
+  . Passing a non-string needle to string search functions is deprecated. In the
+    future the needle will be interpreted as a string instead of an ASCII codepoint.
+    Depending on the intended behavior, you should either explicitly cast the
+    needle to string or perform an explicit call to chr(). The following functions
+    are affected:
+      . strpos()
+      . strrpos()
+      . stripos()
+      . strripos()
+      . strstr()
+      . strchr()
+      . strrchr()
+      . stristr()
+  . The fgetss() function and the string.strip_tags stream filter have been deprecated.
+    This also affects the SplFileObject::fgetss() method and gzgetss() function.
+
+========================================
+5. Changed Functions
+========================================
+
+JSON:
+  . A new flag has been added, JSON_THROW_ON_ERROR, which can be used with
+    json_decode() or json_encode() and causes these functions to throw a
+    JsonException upon an error, instead of setting the global error state that
+    is retrieved with json_last_error(). JSON_PARTIAL_OUTPUT_ON_ERROR takes
+    precedence over JSON_THROW_ON_ERROR.
+    (RFC: https://wiki.php.net/rfc/json_throw_on_error)
+
+Session:
+  . session_set_cookie_params() now also supports the following signature:
+    session_set_cookie_params(array $options)
+    where $options is an associative array which may have any of the keys
+    "lifetime", "path", "domain", "secure", "httponly" and "samesite".
+    Accordingly, the return value of session_get_cookie_params() now also has an
+    element with the key "samesite".
+
+Standard:
+  . debug_zval_dump() was changed to display recursive arrays and objects
+    in the same way as var_dump(). Now, it doesn't display them twice.
+  . array_push() and array_unshift() can now also be called with a single
+    argument, which is particularly convenient wrt. the spread operator.
+  . setcookie() and setrawcookie() now also support the following signature:
+    set(raw)cookie(string $name, [string $value, [array $options]])
+    where $options is an associative array which may have any of the keys
+    "expires", "path", "domain", "secure", "httponly" and "samesite".
+
+PCRE:
+  . preg_quote() now also escapes the '#' character.
+
+LDAP:
+  . Added a serverctrls parameter to send controls to the server in ldap_add,
+    ldap_mod_replace, ldap_mod_add, ldap_mod_del, ldap_rename,
+    ldap_compare, ldap_delete, ldap_modify_batch,
+    ldap_search, ldap_list, ldap_read
+  . Added an out parameter to get controls from the server in ldap_parse_result
+  . Fixed support for LDAP_OPT_SERVER_CONTROLS and LDAP_OPT_CLIENT_CONTROLS in
+    ldap_get_option and ldap_set_option.
+
+
+========================================
+6. New Functions
+========================================
+
+Core:
+  . Added monotonic timer function hrtime([bool get_as_num]). It returns an
+    array of the form [seconds, nanoseconds] with the timestamp starting at
+    an unspecified point in the past. If the optional argument is passed as
+    true, the return value is an integer on 64-bit systems or float on
+    32-bit systems, representing the nanoseconds. The timestamp is not
+    adjustable and is not related to wall clock or time of day. The timers
+    are available under Linux, FreeBSD, Windows, Mac, SunOS, AIX and their
+    derivatives. If no required timers are provided by a corresponding
+    platform, the function returns false.
+  . Added net_get_interfaces() to retrieve an array of available network
+    interfaces including several details.
+  . Added the gc_status() function to retrieve status information regarding the
+    cyclic GC.
+
+Date:
+  . Added the DateTime::createFromImmutable() method, which mirrors
+    DateTimeImmutable::createFromMutable().
+
+FPM:
+  . Added fpm_get_status() function which returns FPM status info array.
+
+GMP:
+  . Added gmp_binomial(n, k) for calculating binomial coefficients.
+  . Added gmp_lcm(a, b) for calculating the least common multiple.
+  . Added gmp_perfect_power(a) to check if number is a perfect power.
+  . Added gmp_kronecker(a, b) to compute the Kronecker symbol.
+
+Intl:
+  . Added void Spoofchecker::setRestrictionLevel(int $level) method, available
+    when linked with ICU >= 58.1. Levels are represented as class constants
+    - Spoofchecker::ASCII
+    - Spoofchecker::HIGHLY_RESTRICTIVE
+    - Spoofchecker::MODERATELY_RESTRICTIVE
+    - Spoofchecker::MINIMALLY_RESTRICTIVE
+    - Spoofchecker::UNRESTRICTIVE
+    - Spoofchecker::SINGLE_SCRIPT_RESTRICTIVE
+    For the detailed documentation on the restriction levels, see
+    URestrictionLevel under
+    http://icu-project.org/apiref/icu4c/uspoof_8h.html
+  . Added Normalizer::getRawDecomposition() and normalizer_get_raw_decomposition(),
+    to retrieve the Decomposition_Mapping property of a character.
+
+LDAP:
+  . Added ldap_exop_refresh() to conveniently perform a Refresh extended
+    operation.
+
+OpenSSL:
+  . Added openssl_pkey_derive that derives a shared secret for DH, ECDH and
+    possibly other future algorithms supported by EVP_PKEY_derive.
+
+Sockets:
+  . Added functions to import/export the WSAPROTOCOL_INFO info struct. This
+    implementation complements the already supported SCM_RIGHTS as in
+    man 3 cmsg and is Windows specific. For the import/export, the default
+    system securities apply for the SHM reading/writing. The socket becomes
+    invalid, when the last reference to it is closed.
+    - socket_wsaprotocol_info_export(resource $sock, int $pid) - exports the
+      WSAPROTOCOL_INFO structure into shared memory and returns an identifier
+      to be used for the import, or false on failure. The exported ID is
+      only valid for the dedicated PID.
+    - socket_wsaprotocol_info_import(string $id) - returns a duplicated
+      socket as per the passed identifier, or false on failure.
+    - socket_wsaprotocol_info_release(string $id) - releases the shared memory
+      corresponding to the passed identifier.
+
+Standard:
+  . Added is_countable() function, to check whether a value may be passed to
+    count().
+    (RFC: https://wiki.php.net/rfc/is-countable)
+  . Added array_key_first() and array_key_last() which retrieve the first and
+    last key of an array, respectively.
+    (RFC: <https://wiki.php.net/rfc/array_key_first_last>)
+
+LDAP:
+  . Added functions ldap_add_ext, ldap_bind_ext, ldap_delete_ext, ldap_mod_add_ext,
+    ldap_mod_replace_ext, ldap_mod_del_ext, ldap_rename_ext
+    which gives access to the result object to be able to parse it
+    with ldap_parse_result and get more information than just success/failure.
+
+
+========================================
+7. New Classes and Interfaces
+========================================
+
+JSON:
+  . JsonException
+
+========================================
+8. Removed Extensions and SAPIs
+========================================
+
+========================================
+9. Other Changes to Extensions
+========================================
+
+ Curl:
+  . libcurl >= 7.15.5 is now required.
+
+ DBA:
+   . As of PHP 7.3.14, dba_open() accepts a fifth optional parameter for lmdb
+     databases which allows to specify the mapsize. The parameter defaults to
+     zero, in which case the compiled in default mapsize (usually 1048576) will
+     be used. The mapsize should be a multiple of the page size of the OS.
+
+ Filter:
+  . FILTER_VALIDATE_FLOAT now also supports a `thousand` option, which
+    defines the set of allowed thousand separator chars.  The default (`"',."`)
+    is fully backward compatible with former PHP versions.
+  . FILTER_SANITIZE_ADD_SLASHES has been added as an alias of the 'magic_quotes'
+    filter (FILTER_SANITIZE_MAGIC_QUOTES). The 'magic_quotes' filter is subject
+  	to removal in future versions of PHP.
+
+ FTP:
+  . Set default transfer mode to binary
+
+ Intl:
+  . Normalizer::NONE is deprecated, when PHP is linked with ICU >= 56
+  . Introduced Normalizer::FORM_KC_CF as Normalizer::normalize() argument
+    for NFKC_Casefold normalization, available when linked with ICU >= 56
+
+ MBString:
+  . The configuration option --with-libmbfl is no longer available.
+
+ ODBC:
+  . Support for ODBCRouter has been removed.
+  . Support for Birdstep has been removed.
+
+ OpenSSL:
+  . The min_proto_version and max_proto_version ssl stream options as well as
+    related constants for possible TLS protocol values have been added.
+    See <https://github.com/php/php-src/pull/3317>.
+
+ PCRE:
+  . The PCRE extension has been upgraded to PCRE2, which may cause minor
+    behavioral changes (for instance, character ranges in classes are now more
+    strictly interpreted), and augments the existing regular expression syntax.
+    See <https://wiki.php.net/rfc/pcre2-migration> for details.
+
+ PDO_DBLIB:
+  . Added the attribute PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS to enable automatic
+    skipping of empty rowsets.
+  . Exposed the TDS version via the PDO::DBLIB_ATTR_TDS_VERSION attribute.
+  . DATETIME2 columns are now treated like DATETIME columns.
+
+ PDO_SQLite:
+  . SQLite3 databases can now be opened in read-only mode by setting the
+    new PDO::SQLITE_ATTR_OPEN_FLAGS attribute to PDO::SQLITE_READONLY.
+
+ Standard:
+  . var_export() now exports stdClass objects as an array casted to an object
+    (`(object) array( ... )`), rather than using the nonexistent method
+    stdClass::__setState().
+
+ Tidy:
+  . Building against tidyp (<https://github.com/petdance/tidyp>) is now also
+    supported transparently. Since tidyp offers no API to get the release date,
+    tidy_get_release() and tidy::getRelease() return 'unknown' in this case.
+
+ XML:
+  . The return value of the `xml_set_external_entity_ref_handler()` callback is
+    now also heeded if the extension has been built against libxml. Formerly,
+    the return value has been ignored, and parsing did never stop.
+
+ Zip:
+  . Building against the bundled libzip is discouraged, but still possible by
+    adding `--without-libzip` to the configuration.
+
+ zlib:
+  . Added the zlib/level context option for the compress.zlib wrapper to
+    facilitate setting the desired compression level.
+
+========================================
+10. New Global Constants
+========================================
+
+Curl:
+  . CURLAUTH_BEARER
+  . CURLAUTH_GSSAPI
+  . CURLE_WEIRD_SERVER_REPLY
+  . CURLINFO_APPCONNECT_TIME_T
+  . CURLINFO_CONNECT_TIME_T
+  . CURLINFO_CONTENT_LENGTH_DOWNLOAD_T
+  . CURLINFO_CONTENT_LENGTH_UPLOAD_T
+  . CURLINFO_FILETIME_T
+  . CURLINFO_HTTP_VERSION
+  . CURLINFO_NAMELOOKUP_TIME_T
+  . CURLINFO_PRETRANSFER_TIME_T
+  . CURLINFO_PROTOCOL
+  . CURLINFO_PROXY_SSL_VERIFYRESULT
+  . CURLINFO_REDIRECT_TIME_T
+  . CURLINFO_SCHEME
+  . CURLINFO_SIZE_DOWNLOAD_T
+  . CURLINFO_SIZE_UPLOAD_T
+  . CURLINFO_SPEED_DOWNLOAD_T
+  . CURLINFO_SPEED_UPLOAD_T
+  . CURLINFO_STARTTRANSFER_TIME_T
+  . CURLINFO_TOTAL_TIME_T
+  . CURL_LOCK_DATA_CONNECT
+  . CURL_LOCK_DATA_PSL
+  . CURL_MAX_READ_SIZE
+  . CURLOPT_ABSTRACT_UNIX_SOCKET
+  . CURLOPT_DISALLOW_USERNAME_IN_URL
+  . CURLOPT_DNS_SHUFFLE_ADDRESSES
+  . CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS
+  . CURLOPT_HAPROXYPROTOCOL
+  . CURLOPT_KEEP_SENDING_ON_ERROR
+  . CURLOPT_PRE_PROXY
+  . CURLOPT_PROXY_CAINFO
+  . CURLOPT_PROXY_CAPATH
+  . CURLOPT_PROXY_CRLFILE
+  . CURLOPT_PROXY_KEYPASSWD
+  . CURLOPT_PROXY_PINNEDPUBLICKEY
+  . CURLOPT_PROXY_SSLCERT
+  . CURLOPT_PROXY_SSLCERTTYPE
+  . CURLOPT_PROXY_SSL_CIPHER_LIST
+  . CURLOPT_PROXY_SSLKEY
+  . CURLOPT_PROXY_SSLKEYTYPE
+  . CURLOPT_PROXY_SSL_OPTIONS
+  . CURLOPT_PROXY_SSL_VERIFYHOST
+  . CURLOPT_PROXY_SSL_VERIFYPEER
+  . CURLOPT_PROXY_SSLVERSION
+  . CURLOPT_PROXY_TLS13_CIPHERS
+  . CURLOPT_PROXY_TLSAUTH_PASSWORD
+  . CURLOPT_PROXY_TLSAUTH_TYPE
+  . CURLOPT_PROXY_TLSAUTH_USERNAME
+  . CURLOPT_REQUEST_TARGET
+  . CURLOPT_SOCKS5_AUTH
+  . CURLOPT_SSH_COMPRESSION
+  . CURLOPT_SUPPRESS_CONNECT_HEADERS
+  . CURLOPT_TIMEVALUE_LARGE
+  . CURLOPT_TLS13_CIPHERS
+  . CURLPROXY_HTTPS
+  . CURLSSH_AUTH_GSSAPI
+  . CURL_SSLVERSION_MAX_DEFAULT
+  . CURL_SSLVERSION_MAX_NONE
+  . CURL_SSLVERSION_MAX_TLSv1_0
+  . CURL_SSLVERSION_MAX_TLSv1_1
+  . CURL_SSLVERSION_MAX_TLSv1_2
+  . CURL_SSLVERSION_MAX_TLSv1_3
+  . CURL_SSLVERSION_TLSv1_3
+  . CURL_VERSION_ALTSVC
+  . CURL_VERSION_ASYNCHDNS
+  . CURL_VERSION_BROTLI
+  . CURL_VERSION_CONV
+  . CURL_VERSION_CURLDEBUG
+  . CURL_VERSION_DEBUG
+  . CURL_VERSION_GSSAPI
+  . CURL_VERSION_GSSNEGOTIATE
+  . CURL_VERSION_HTTPS_PROXY
+  . CURL_VERSION_IDN
+  . CURL_VERSION_LARGEFILE
+  . CURL_VERSION_MULTI_SSL
+  . CURL_VERSION_NTLM
+  . CURL_VERSION_NTLM_WB
+  . CURL_VERSION_PSL
+  . CURL_VERSION_SPNEGO
+  . CURL_VERSION_SSPI
+  . CURL_VERSION_TLSAUTH_SRP
+
+Filter:
+  . FILTER_SANITIZE_ADD_SLASHES
+
+JSON:
+  . JSON_THROW_ON_ERROR
+
+OpenSSL:
+  . STREAM_CRYPTO_PROTO_SSLv3
+  . STREAM_CRYPTO_PROTO_TLSv1_0
+  . STREAM_CRYPTO_PROTO_TLSv1_1
+  . STREAM_CRYPTO_PROTO_TLSv1_2
+
+MBString:
+  . MB_CASE_FOLD
+  . MB_CASE_LOWER_SIMPLE
+  . MB_CASE_UPPER_SIMPLE
+  . MB_CASE_TITLE_SIMPLE
+  . MB_CASE_FOLD_SIMPLE
+
+PGSQL:
+  . Requires Postgres 9.3
+    - PGSQL_DIAG_SCHEMA_NAME
+	- PGSQL_DIAG_TABLE_NAME
+	- PGSQL_DIAG_COLUMN_NAME
+	- PGSQL_DIAG_DATATYPE_NAME
+	- PGSQL_DIAG_CONSTRAINT_NAME
+  . Requires Postgres 9.6
+    - PGSQL_DIAG_SEVERITY_NONLOCALIZED
+
+Standard:
+  . PASSWORD_ARGON2ID
+
+LDAP:
+  . LDAP_CONTROL_MANAGEDSAIT
+  . LDAP_CONTROL_PROXY_AUTHZ
+  . LDAP_CONTROL_SUBENTRIES
+  . LDAP_CONTROL_VALUESRETURNFILTER
+  . LDAP_CONTROL_ASSERT
+  . LDAP_CONTROL_PRE_READ
+  . LDAP_CONTROL_POST_READ
+  . LDAP_CONTROL_SORTREQUEST
+  . LDAP_CONTROL_SORTRESPONSE
+  . LDAP_CONTROL_PAGEDRESULTS
+  . LDAP_CONTROL_AUTHZID_REQUEST
+  . LDAP_CONTROL_AUTHZID_RESPONSE
+  . LDAP_CONTROL_SYNC
+  . LDAP_CONTROL_SYNC_STATE
+  . LDAP_CONTROL_SYNC_DONE
+  . LDAP_CONTROL_DONTUSECOPY
+  . LDAP_CONTROL_PASSWORDPOLICYREQUEST
+  . LDAP_CONTROL_PASSWORDPOLICYRESPONSE
+  . LDAP_CONTROL_X_INCREMENTAL_VALUES
+  . LDAP_CONTROL_X_DOMAIN_SCOPE
+  . LDAP_CONTROL_X_PERMISSIVE_MODIFY
+  . LDAP_CONTROL_X_SEARCH_OPTIONS
+  . LDAP_CONTROL_X_TREE_DELETE
+  . LDAP_CONTROL_X_EXTENDED_DN
+  . LDAP_CONTROL_VLVREQUEST
+  . LDAP_CONTROL_VLVRESPONSE
+
+========================================
+11. Changes to INI File Handling
+========================================
+
+- birdstep.max_links
+  . This INI directive has been removed.
+
+- opcache.inherited_hack
+  . This INI directive has been removed. The value has already been ignored
+    since PHP 5.3.0.
+
+- session.cookie_samesite
+  . New INI option to allow to set the SameSite directive for cookies. Defaults
+    to "" (empty string), so no SameSite directive is set. Can be set to "Lax"
+    or "Strict", which sets the respective SameSite directive.
+
+- syslog.facility
+  - New INI to set syslog facility which specifies what type of program is
+    logging the message. It is used only when error_log is set to syslog.
+
+- syslog.filter
+  . New INI to set syslog filter type to filter the logged messages. There are
+    3 supported filter types - all, no-ctrl and ascii. It is used only when
+    error_log is set to syslog.
+
+- syslog.ident
+  . New INI to set syslog ident string which is prepended to every message. It
+    is used only when error_log is set syslog.
+
+- mbstring.regex_stack_limit
+  . New INI directive (since 7.3.5) limiting stack depth of mbstring/oniguruma
+  regular expressions.
+
+========================================
+12. Windows Support
+========================================
+
+- Core
+  . File descriptors are opened in shared read/write/delete mode by default.
+    This effectively maps the UNIX semantics and allows to delete files with
+    handles in use. It is not 100% same, some platform differences still
+    persist. After the deletion, the filename entry is blocked, until all
+    the opened handles to it are closed.
+
+========================================
+13. Other Changes
+========================================
+
+. The cyclic GC has been enhanced, which may result in considerable performance
+  improvements.

+ 208 - 0
EVSE/GPL/php-7.3.28/UPGRADING.INTERNALS

@@ -0,0 +1,208 @@
+PHP 7.3 INTERNALS UPGRADE NOTES
+
+1. Internal API changes
+  a. array_init() and array_init_size()
+  b. Run-time constant operand addressing
+  c. Array/Object recursion protection
+  d. HASH_FLAG_PERSISTENT
+  e. AST and IS_CONSTANT
+  f. GC_REFCOUNT()
+  g. zend_get_parameters()
+  h. zend_register_persistent_resource()
+  i. RAND_RANGE()
+  j. cast_object() with _IS_NUMBER
+  k. zend_fcall_info_cache.initialized
+  l. php_hrtime_current()
+  m. zend_cpu_supports()
+  n. IS_TYPE_COPYABLE
+  o. IS_UNUSED
+  p. VM instruction operands (FETCH_CLASS, FETCH_CONSTANT, CATCH)
+  q. sapi_cli_single_write()
+  r. php_url
+  s. zend_function.reserved[]
+  t. zif_handler
+  u. GC_G
+  v. php_add[c]slashes
+  w. zend_class_entry.iterator_funcs
+  x. Class declaration opcodes (DECLARE_INHERITED_CLASS ...)
+  y. zend_constant
+  z. HAVE_ST_BLKSIZE and HAVE_ST_RDEV
+  aa. RETSIGTYPE
+  bb. php_setcookie
+
+2. Build system changes
+  a. Unix build system changes
+  b. Windows build system changes
+
+
+3. Module changes
+
+========================
+1. Internal API changes
+========================
+
+  a. array_init() and array_init_size() are not functions anymore.
+     They don't return any values.
+
+  b. In 64-bit builds PHP-7.2 and below used relative run-time constant operand
+     addressing. E.g. opline->op1.constant kept an offset from start of literals
+     table - op_array->literals. To speedup access op_array->literals was cached
+     in execute_data->literals. So the resulting address calculated as
+     EX(literals) + opline->op1.constant.
+
+     Now at run-time literals allocated close to opcodes, and addressed
+     relatively from current opline. This eliminates load of EX(literals) on
+     each constant access as well as EX(literals) initialization on each call.
+
+     As result some related macros were removed (ZEND_EX_USE_LITERALS,
+     EX_LOAD_LITERALS, EX_LITERALS, RT_CONSTANT_EX, EX_CONSTANT) or changed
+     (RT_CONSTANT, ZEND_PASS_TWO_UPDATE_CONSTANT, ZEND_PASS_TWO_UNDO_CONSTANT).
+     This change may affect only some "system" extensions. EX_LITERALS,
+     RT_CONSTANT_EX, EX_CONSTANT should be substituted by RT_CONSTANT, and now
+     use "opline" (instead of "op_array") as first argument.
+
+  c. Protection from recursion during processing circular data structures was
+     refactored. HashTable.nApplyCount and IS_OBJ_APPLY_COUNT are replaced by
+     single flag GC_PROTECTED. Corresponding macros Z_OBJ_APPLY_COUNT,
+     Z_OBJ_INC_APPLY_COUNT, Z_OBJ_DEC_APPLY_COUNT, ZEND_HASH_GET_APPLY_COUNT,
+     ZEND_HASH_INC_APPLY_COUNT, ZEND_HASH_DEC_APPLY_COUNT are replaced with
+     GC_IS_RECURSIVE, GC_PROTECT_RECURSION, GC_UNPROTECT_RECURSION,
+     Z_IS_RECURSIVE, Z_PROTECT_RECURSION, Z_UNPROTECT_RECURSION.
+
+     HASH_FLAG_APPLY_PROTECTION flag and ZEND_HASH_APPLY_PROTECTION() macro
+     are removed. All mutable arrays should use recursion protection.
+     Corresponding checks should be replaced by Z_REFCOUNTED() or
+     !(GC_FLAGS(p) & GC_IMMUTABLE).
+
+  d. HASH_FLAG_PERSISTENT renamed into IS_ARRAY_PERSISTENT and moved into
+     GC_FLAGS (to be consistent with IS_STR_PERSISTENT).
+
+  e. zend_ast_ref structure is changed to use only one allocation.
+     zend_ast_copy() now returns zend_ast_ref (instead of zend_asr).
+     zend_ast_destroy_and_free() is removed. ZVAL_NEW_AST() is replaced
+     by ZVAL_AST().
+
+     IS_CONSTANT type and Z_CONST_FLAGS() are removed. Now constants are always
+     represented using IS_CONSTANT_AST (ZEND_AST_CONSTANT kind). AST node
+     attributes are used instead of constant flags. IS_TYPE_CONSTANT flag is
+     removed, but Z_CONSTANT() macro is kept for compatibility.
+
+  f. GC_REFCOUNT() is turned into inline function and can't be modified direcly.
+     All reference-counting operations should be done through corresponding
+     macros GC_SET_REFCOUNT(), GC_ADDREF() and GC_DELREF().
+
+     GC_REFCOUNT(p)++ should be changed into GC_ADDREF(p),
+     GC_REFCOUNT(p)-- into GC_DELREF(p),
+     GC_REFCOUNT(p) = 1 into GC_SET_REFCOUNT(p, 1).
+
+  g. The zend_get_parameters() and zend_get_parameters_ex() functions were
+     removed. Instead zend_parse_parameters() should be used.
+
+  h. New functions zend_register_persistent_resource() or
+     zend_register_persistent_resource_ex() should beused to register
+     persistent resources, instead of manual insertion into EG(persistent_list).
+
+  i. The RAND_RANGE() macro has been removed. php_mt_rand_range() should be
+     used instead.
+
+  j. The cast_object() object handler now also accepts the _IS_NUMBER type. The
+     handler should return either an integer or float value in this case,
+     whichever is more appropriate.
+
+  k. zend_fcall_info_cache.initialized is removed. zend_fcall_info_cache is
+     initialized if zend_fcall_info_cache.function_handler is set.
+
+  l. php_hrtime_current() delivers the number of nanoseconds since an uncertain
+     point in the past.
+
+  m. zend_cpu_supports() determines if a feature is supported by current cpu.
+     Also serial inline zend_cpu_supports_xxx() are added, which is designed for
+     ifunc resolver function, as resolver function should not depend on any
+     external function.
+
+  n. IS_TYPE_COPYABLE flag is removed. IS_STRING zvals didn't need to be
+     duplication by zval_copy_ctor(), ZVAL_DUP() and SEPARATE_ZVAL*() macros.
+     Interned strings didn't set IS_TYPE_COPYABLE, so they aren't affected at
+     all. Now instead of checking for IS_TYPE_COPYABLE, engine checks for
+     IS_ARRAY type (it may be IS_TYPE_REFCOUNTED or not). All the related
+     macros: Z_COPYABLE..., Z_IMMUTABLE... are kept for compatibility.
+
+  o. IS_UNUSED became zero and can't be used as a bitmask (there were no such
+     usages in PHP sources).
+
+  p. Operands of few VM instructions were changed
+    - FETCH_CLASS     op1<fetch-flags>, op2<name>, result<var>
+    - FETCH_CONSTANT  op1<fetch-flags>, op2<name>, result<tmp>
+    - CATCH           ext<last-flag>, op1<name>, op2<jump_addr>, result<cv>
+
+ q.  sapi_cli_single_write() now returns ssize_t instead of size_t.
+
+ r.  fields of php_url struct change from char * to zend_string *
+
+ s. Special purpose zend_functions marked by ZEND_ACC_CALL_VIA_TRAMPOLINE or
+    ZEND_ACC_FAKE_CLOSURE flags use reserved[0] for internal purpose.
+    Third party extensions must not modify reserved[] fields of these functions.
+
+ t. For internal functions the typedef zif_handler has been introduced.  It is
+    recommended to use this from now on, instead of defining own handler types.
+
+ u. The GC globals (GC_G) are now private. Use the new zend_gc_get_status() to
+    retrieve status information of the GC.
+
+ v. The should_free argument of the php_add[c]slashes functions has been
+    removed.  It is now always the caller's responsibility to free the passed
+    string.
+
+ w. zend_class_entry.iterator_funcs have been replaced by iterator_funcs_ptr.
+    You don't have to set its value, setting parent.funcs in the get_iterator
+    function is enough.
+
+ x. Class declaration opcode formats were changed
+  - DECLARE_INHERITED_CLASS and DECLARE_ANON_INHERITED_CLASS now encode parent
+    class name in second operand directly (as IS_CONST operand). Previously,
+    parent class was fetched by the prior FETCH_CLASS opcode.
+  - ADD_INTERFACE and ADD_TRAIT don't use run-time cache to keep interface or
+    trait. These instructions are executed once, and caching is useless.
+
+ y. zend_constant.flags and zend_constant.module_number are packed into
+    reserved space inside zend_constant.value. They should be accessed using
+    ZEND_CONSTANT_FLAGS(), ZEND_CONSTANT_MODULE_NUMBER() and
+    ZEND_CONSTANT_SET_FLAGS() macros.
+
+ z. HAVE_ST_BLKSIZE must be replaced with HAVE_STRUCT_STAT_ST_BLKSIZE and
+    HAVE_ST_RDEV must be replaced with HAVE_STRUCT_STAT_ST_RDEV.
+
+ aa. RETSIGTYPE has been removed from the generated php_config.h and should be
+    replaced with void.
+
+ bb. php_setcookie() now expects an additional samesite argument, and the
+    url_encode parameter has been moved to the end. The signature is now:
+    int php_setcookie(zend_string *name, zend_string *value, time_t expires,
+                      zend_string *path, zend_string *domain, int secure,
+                      int httponly, zend_string *samesite, int url_encode);
+
+========================
+2. Build system changes
+========================
+
+  a. Unix build system changes
+    - PHP_PROG_LEX, TSRM_CHECK_GCC_ARG, and LIBZEND_CPLUSPLUS_CHECKS Autoconf
+      macros have been removed.
+    - Minimum Autoconf version is 2.68+ for generating the configure script.
+
+  b. Windows build system changes
+    - ZEND_WIN32_FORCE_INLINE doesn't affect C++ anymore. zend_always_inline is
+      still usable in C++, but anything else inlining related is up to
+      compiler.
+    - ZEND_WIN32_KEEP_INLINE was removed, it was only needed for C++
+      convenience and is now default behavior with C++.
+    - New configure option --enable-native-intrinsics accepts a list of the
+      intrinsic optimizations to enable. It affects both the code generation
+      and the explicit optimizations guarded by preprocessor macros.
+    - The configure option --with-codegen-arch accepts only ia32 as a value.
+      Use it, to produce builds suitable for older processors without SSE2 or
+      even SSE support.
+
+========================
+3. Module changes
+========================

+ 56 - 0
EVSE/GPL/php-7.3.28/Zend/LICENSE

@@ -0,0 +1,56 @@
+--------------------------------------------------------------------
+                The Zend Engine License, Version 2.00
+Copyright (c) 1999-2006 Zend Technologies Ltd. All rights reserved.
+--------------------------------------------------------------------
+
+Redistribution and use in source and binary forms, with or without
+modification, is permitted provided that the following conditions
+are met:
+
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+
+  2. Redistributions in binary form must reproduce the above
+     copyright notice, this list of conditions and the following
+     disclaimer in the documentation and/or other materials provided
+     with the distribution.
+
+  3. The names "Zend" and "Zend Engine" must not be used to endorse
+     or promote products derived from this software without prior
+     permission from Zend Technologies Ltd. For written permission,
+     please contact license@zend.com.
+
+  4. Zend Technologies Ltd. may publish revised and/or new versions
+     of the license from time to time. Each version will be given a
+     distinguishing version number.
+     Once covered code has been published under a particular version
+     of the license, you may always continue to use it under the
+     terms of that version. You may also choose to use such covered
+     code under the terms of any subsequent version of the license
+     published by Zend Technologies Ltd. No one other than Zend
+     Technologies Ltd. has the right to modify the terms applicable
+     to covered code created under this License.
+
+  5. Redistributions of any form whatsoever must retain the following
+     acknowledgment:
+     "This product includes the Zend Engine, freely available at
+     http://www.zend.com"
+
+  6. All advertising materials mentioning features or use of this
+     software must display the following acknowledgment:
+     "The Zend Engine is freely available at http://www.zend.com"
+
+THIS SOFTWARE IS PROVIDED BY ZEND TECHNOLOGIES LTD. ``AS IS'' AND
+ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL ZEND
+TECHNOLOGIES LTD.  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+--------------------------------------------------------------------

+ 55 - 0
EVSE/GPL/php-7.3.28/Zend/Makefile.am

@@ -0,0 +1,55 @@
+## Process this file with automake to produce Makefile.in -*- makefile -*-
+
+#CLEANFILES = zend_language_parser.c zend_language_parser.h zend_language_scanner.c zend_language_parser.output zend_ini_parser.c zend_ini_parser.h zend_ini_scanner.c zend_ini_parser.output
+
+AUTOMAKE_OPTIONS=foreign
+noinst_LTLIBRARIES=libZend.la
+
+libZend_la_SOURCES=\
+	zend_language_parser.y zend_language_scanner.l \
+	zend_ini_parser.y zend_ini_scanner.l \
+	zend_alloc.c zend_compile.c zend_constants.c \
+	zend_execute.c zend_execute_API.c zend_highlight.c zend_llist.c \
+	zend_vm_opcodes.c zend_opcode.c zend_operators.c zend_ptr_stack.c zend_stack.c \
+	zend_variables.c zend.c zend_API.c zend_extensions.c zend_hash.c \
+	zend_list.c zend_builtin_functions.c zend_sprintf.c \
+	zend_ini.c zend_sort.c zend_objects.c zend_object_handlers.c \
+	zend_objects_API.c zend_ts_hash.c zend_stream.c \
+	zend_default_classes.c \
+	zend_iterators.c zend_interfaces.c zend_exceptions.c \
+	zend_strtod.c zend_closures.c zend_float.c zend_string.c zend_signal.c \
+	zend_generators.c zend_virtual_cwd.c zend_ast.c zend_smart_str.c zend_cpuinfo.c
+
+libZend_la_CFLAGS = -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1
+libZend_la_LDFLAGS =
+libZend_la_LIBADD = @ZEND_EXTRA_LIBS@
+
+# automake isn't too clever about "non-standard" use of lex and yacc
+
+$(libZend_la_OBJECTS): zend_language_parser.h
+
+zend_ini_scanner.lo: zend_ini_parser.h
+
+# Language parser/scanner rules
+
+zend_language_scanner.c: $(srcdir)/zend_language_scanner.l
+	$(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt $(srcdir)/zend_language_scanner_defs.h -o$@ $(srcdir)/zend_language_scanner.l
+
+zend_language_parser.h: zend_language_parser.c
+zend_language_parser.c: $(srcdir)/zend_language_parser.y
+	$(YACC) -p zend -v -d $(srcdir)/zend_language_parser.y -o zend_language_parser.c
+
+# INI parser/scanner rules
+
+zend_ini_parser.c: $(srcdir)/zend_ini_parser.y
+	$(YACC) -p ini_ -v -d $(srcdir)/zend_ini_parser.y -o zend_ini_parser.c
+
+zend_ini_scanner.c: $(srcdir)/zend_ini_scanner.l
+	$(RE2C) $(RE2C_FLAGS) --no-generation-date --case-inverted -cbdFt $(srcdir)/zend_ini_scanner_defs.h -o$@ $(srcdir)/zend_ini_scanner.l
+
+zend_ini_parser.h: zend_ini_parser.c
+
+depend:
+
+zend_execute.lo: $(srcdir)/zend_execute.c
+	$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CPPFLAGS) $(INLINE_CFLAGS) -c $(srcdir)/zend_execute.c

+ 1 - 0
EVSE/GPL/php-7.3.28/Zend/Makefile.frag

@@ -0,0 +1 @@
+Zend/zend_execute.lo: $(srcdir)/zend_vm_execute.h $(srcdir)/zend_vm_opcodes.h

+ 43 - 0
EVSE/GPL/php-7.3.28/Zend/README.ZEND_MM

@@ -0,0 +1,43 @@
+Zend Memory Manager
+===================
+
+General:
+--------
+
+The goal of the new memory manager (available since PHP 5.2) is to reduce memory
+allocation overhead and speedup memory management.
+
+The new manager's "configure" has no "--disable-zend-memory-manager" option,
+but it has "--enable-malloc-mm" instead.  It is enabled by default in DEBUG
+build and disabled by default in RELEASE build. When enabled it allows selecting
+between malloc and emalloc at runtime so you can use internal and external memory
+debuggers without recompilation.
+
+Debugging:
+----------
+
+Normal:
+
+    $ sapi/cli/php -r 'leak();'
+
+Zend MM disabled:
+
+    $ USE_ZEND_ALLOC=0 valgrind --leak-check=full sapi/cli/php -r 'leak();'
+
+Shared extensions:
+------------------
+
+Since PHP 5.3.11 it is possible to prevent shared extensions from unloading so
+that valgrind can correctly track the memory leaks in shared extensions. For
+this there is the ZEND_DONT_UNLOAD_MODULES environment variable. If set, then
+DL_UNLOAD() is skipped during the shutdown of shared extensions.
+
+
+Tweaking:
+---------
+
+The Zend MM can be tweaked using ZEND_MM_MEM_TYPE and ZEND_MM_SEG_SIZE environment
+variables.  Default values are "malloc" and "256K". Dependent on target system you
+can also use "mmap_anon", "mmap_zero" and "win32" storage managers.
+
+	$ ZEND_MM_MEM_TYPE=mmap_anon ZEND_MM_SEG_SIZE=1M sapi/cli/php ..etc.

+ 102 - 0
EVSE/GPL/php-7.3.28/Zend/README.ZEND_VM

@@ -0,0 +1,102 @@
+ZEND_VM
+=======
+
+ZEND_VM architecture allows specializing opcode handlers according to op_type
+fields and using different execution methods (call threading, switch threading
+and direct threading). As a result ZE2 got more than 20% speedup on raw PHP
+code execution (with specialized executor and direct threading execution
+method). As in most PHP applications raw execution speed isn't the limiting
+factor but system calls and database calls are, your mileage with this patch
+will vary.
+
+Most parts of the old zend_execute.c go into zend_vm_def.h. Here you can
+find opcode handlers and helpers. The typical opcode handler template looks
+like this:
+
+ZEND_VM_HANDLER(<OPCODE-NUMBER>, <OPCODE>, <OP1_TYPES>, <OP2_TYPES>)
+{
+	<HANDLER'S CODE>
+}
+
+<OPCODE-NUMBER> is a opcode number (0, 1, ...)
+<OPCODE> is an opcode name (ZEN_NOP, ZEND_ADD, :)
+<OP1_TYPES> & <OP2_TYPES> are masks for allowed operand op_types. Specializer
+will generate code only for defined combination of types. You can use any
+combination of the following op_types UNUSED, CONST, VAR, TMP and  CV also
+you can use ANY mask to disable specialization according operand's op_type.
+<HANDLER'S CODE> is a handler's code itself. For most handlers it stills the
+same as in old zend_execute.c, but now it uses macros to access opcode operands
+and some internal executor data.
+
+You can see the conformity of new macros to old code in the following list:
+
+EXECUTE_DATA
+	execute_data
+ZEND_VM_DISPATCH_TO_HANDLER(<OP>)
+	return <OP>_helper(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)
+ZEND_VM_DISPATCH_TO_HELPER(<NAME>)
+	return <NAME>(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)
+ZEND_VM_DISPATCH_TO_HELPER_EX(<NAME>,<PARAM>,<VAL>)
+	return <NAME>(<VAL>, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)
+ZEND_VM_CONTINUE()
+	return 0
+ZEND_VM_NEXT_OPCODE()
+	NEXT_OPCODE()
+ZEND_VM_SET_OPCODE(<TARGET>
+	SET_OPCODE(<TARGET>
+ZEND_VM_INC_OPCODE()
+	INC_OPCOD()
+ZEND_VM_RETURN_FROM_EXECUTE_LOOP()
+	RETURN_FROM_EXECUTE_LOOP()
+ZEND_VM_C_LABEL(<LABEL>):
+	<LABEL>:
+ZEND_VM_C_GOTO(<LABEL>)
+	goto <LABEL>
+OP<X>_TYPE
+	opline->op<X>.op_type
+GET_OP<X>_ZVAL_PTR(<TYPE>)
+	get_zval_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>)
+GET_OP<X>_ZVAL_PTR_PTR(<TYPE>)
+	get_zval_ptr_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>)
+GET_OP<X>_OBJ_ZVAL_PTR(<TYPE>)
+	get_obj_zval_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>)
+GET_OP<X>_OBJ_ZVAL_PTR_PTR(<TYPE>)
+	get_obj_zval_ptr_ptr(&opline->op<X>, EX(Ts), &free_op<X>, <TYPE>)
+IS_OP<X>_TMP_FREE()
+	IS_TMP_FREE(free_op<X>)
+FREE_OP<X>()
+	FREE_OP(free_op<X>)
+FREE_OP<X>_IF_VAR()
+	FREE_VAR(free_op<X>)
+FREE_OP<X>_VAR_PTR()
+	FREE_VAR_PTR(free_op<X>)
+
+
+Executor's helpers can be defined without parameters or with one parameter.
+This is done with the following constructs:
+
+ZEND_VM_HELPER(<HELPER-NAME>, <OP1_TYPES>, <OP2_TYPES>)
+{
+	<HELPER'S CODE>
+}
+
+ZEND_VM_HELPER_EX(<HELPER-NAME>, <OP1_TYPES>, <OP2_TYPES>, <PARAM_SPEC>)
+{
+	<HELPER'S CODE>
+}
+
+Executor's code is generated by PHP script zend_vm_gen.php it uses zend_vm_def.h
+and zend_vm_execute.skl as input and produces zend_vm_opcodes.h and
+zend_vm_execute.h. The first file is a list of opcode definitions. It is
+included from zend_compile.h. The second one is an executor code itself. It is
+included from zend_execute.c.
+
+zend_vm_gen.php can produce different kind of executors. You can select
+different opcode threading model using --with-vm-kind=CALL|SWITCH|GOTO. You can
+disable opcode specialization using --without-specializer. You can include or
+exclude old executor together with specialized one using --without-old-executor.
+At last you can debug executor using original zend_vm_def.h or generated file
+zend_vm_execute.h. Debugging with original file requires --with-lines
+option. By default ZE2 uses the following command to generate executor:
+
+$ php zend_vm_gen.php --with-vm-kind=CALL

+ 617 - 0
EVSE/GPL/php-7.3.28/Zend/Zend.m4

@@ -0,0 +1,617 @@
+dnl
+dnl This file contains Zend specific autoconf functions.
+dnl
+
+AC_DEFUN([LIBZEND_CHECK_INT_TYPE],[
+AC_MSG_CHECKING(for $1)
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#elif HAVE_STDINT_H
+#include <stdint.h>
+#endif]],
+[[if (($1 *) 0)
+  return 0;
+if (sizeof ($1))
+  return 0;
+]])],[
+  AC_DEFINE_UNQUOTED([HAVE_]translit($1,a-z_-,A-Z__), 1,[Define if $1 type is present. ])
+  AC_MSG_RESULT(yes)
+], [AC_MSG_RESULT(no)
+])dnl
+])
+
+AC_DEFUN([LIBZEND_BASIC_CHECKS],[
+
+AC_REQUIRE([AC_PROG_YACC])
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_PROG_CC_C_O])
+AC_REQUIRE([AC_HEADER_STDC])
+
+LIBZEND_BISON_CHECK
+
+dnl Ugly hack to get around a problem with gcc on AIX.
+if test "$CC" = "gcc" -a "$ac_cv_prog_cc_g" = "yes" -a \
+   "`uname -sv`" = "AIX 4"; then
+	CFLAGS=`echo $CFLAGS | sed -e 's/-g//'`
+fi
+
+dnl Hack to work around a Mac OS X cpp problem
+dnl Known versions needing this workaround are 5.3 and 5.4
+if test "$ac_cv_prog_gcc" = "yes" -a "`uname -s`" = "Rhapsody"; then
+        CPPFLAGS="$CPPFLAGS -traditional-cpp"
+fi
+
+AC_CHECK_HEADERS(
+inttypes.h \
+stdint.h \
+limits.h \
+malloc.h \
+string.h \
+unistd.h \
+stdarg.h \
+sys/types.h \
+sys/time.h \
+signal.h \
+unix.h \
+stdlib.h \
+cpuid.h \
+dlfcn.h)
+
+AC_TYPE_SIZE_T
+
+AC_DEFUN([LIBZEND_LIBDL_CHECKS],[
+AC_CHECK_LIB(dl, dlopen, [LIBS="-ldl $LIBS"])
+AC_CHECK_FUNC(dlopen,[AC_DEFINE(HAVE_LIBDL, 1,[ ])])
+])
+
+AC_DEFUN([LIBZEND_DLSYM_CHECK],[
+dnl
+dnl Ugly hack to check if dlsym() requires a leading underscore in symbol name.
+dnl
+AC_MSG_CHECKING([whether dlsym() requires a leading underscore in symbol names])
+_LT_AC_TRY_DLOPEN_SELF([
+  AC_MSG_RESULT(no)
+], [
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(DLSYM_NEEDS_UNDERSCORE, 1, [Define if dlsym() requires a leading underscore in symbol names. ])
+], [
+  AC_MSG_RESULT(no)
+], [])
+])
+
+dnl This is required for QNX and may be some BSD derived systems
+AC_CHECK_TYPE( uint, unsigned int )
+AC_CHECK_TYPE( ulong, unsigned long )
+
+dnl Check if int32_t and uint32_t are defined
+LIBZEND_CHECK_INT_TYPE(int32_t)
+LIBZEND_CHECK_INT_TYPE(uint32_t)
+
+dnl Checks for library functions.
+AC_FUNC_VPRINTF
+AC_FUNC_MEMCMP
+AC_FUNC_ALLOCA
+AC_CHECK_FUNCS(memcpy strdup getpid kill strtod strtol finite fpclass sigsetjmp)
+AC_ZEND_BROKEN_SPRINTF
+
+AC_CHECK_DECLS([isfinite, isnan, isinf], [], [], [[#include <math.h>]])
+
+ZEND_FP_EXCEPT
+
+ZEND_CHECK_FLOAT_PRECISION
+
+dnl test whether double cast to long preserves least significant bits
+AC_MSG_CHECKING(whether double cast to long preserves least significant bits)
+
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits.h>
+
+int main()
+{
+	if (sizeof(long) == 4) {
+		double d = (double) LONG_MIN * LONG_MIN + 2e9;
+
+		if ((long) d == 2e9 && (long) -d == -2e9) {
+			return 0;
+		}
+	} else if (sizeof(long) == 8) {
+		double correct = 18e18 - ((double) LONG_MIN * -2); /* Subtract ULONG_MAX + 1 */
+
+		if ((long) 18e18 == correct) { /* On 64-bit, only check between LONG_MAX and ULONG_MAX */
+			return 0;
+		}
+	}
+	return 1;
+}
+]])], [
+  AC_DEFINE([ZEND_DVAL_TO_LVAL_CAST_OK], 1, [Define if double cast to long preserves least significant bits])
+  AC_MSG_RESULT(yes)
+], [
+  AC_MSG_RESULT(no)
+], [
+  AC_MSG_RESULT(no)
+])
+
+])
+
+AC_DEFUN([LIBZEND_ENABLE_DEBUG],[
+
+AC_ARG_ENABLE(debug,
+[  --enable-debug          Compile with debugging symbols],[
+  ZEND_DEBUG=$enableval
+],[
+  ZEND_DEBUG=no
+])
+
+])
+
+AC_DEFUN([LIBZEND_OTHER_CHECKS],[
+
+AC_ARG_ENABLE(maintainer-zts,
+[  --enable-maintainer-zts Enable thread safety - for code maintainers only!!],[
+  ZEND_MAINTAINER_ZTS=$enableval
+],[
+  ZEND_MAINTAINER_ZTS=no
+])
+
+AC_ARG_ENABLE(inline-optimization,
+[  --disable-inline-optimization
+                          If building zend_execute.lo fails, try this switch],[
+  ZEND_INLINE_OPTIMIZATION=$enableval
+],[
+  ZEND_INLINE_OPTIMIZATION=yes
+])
+
+AC_MSG_CHECKING(whether to enable thread-safety)
+AC_MSG_RESULT($ZEND_MAINTAINER_ZTS)
+
+AC_MSG_CHECKING(whether to enable inline optimization for GCC)
+AC_MSG_RESULT($ZEND_INLINE_OPTIMIZATION)
+
+AC_MSG_CHECKING(whether to enable Zend debugging)
+AC_MSG_RESULT($ZEND_DEBUG)
+
+if test "$ZEND_DEBUG" = "yes"; then
+  AC_DEFINE(ZEND_DEBUG,1,[ ])
+  echo " $CFLAGS" | grep ' -g' >/dev/null || DEBUG_CFLAGS="-g"
+  if test "$CFLAGS" = "-g -O2"; then
+  	CFLAGS=-g
+  fi
+  test -n "$GCC" && DEBUG_CFLAGS="$DEBUG_CFLAGS -Wall"
+  test -n "$GCC" && test "$USE_MAINTAINER_MODE" = "yes" && \
+    DEBUG_CFLAGS="$DEBUG_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations"
+else
+  AC_DEFINE(ZEND_DEBUG,0,[ ])
+fi
+
+test -n "$DEBUG_CFLAGS" && CFLAGS="$CFLAGS $DEBUG_CFLAGS"
+
+if test "$ZEND_MAINTAINER_ZTS" = "yes"; then
+  AC_DEFINE(ZTS,1,[ ])
+  CFLAGS="$CFLAGS -DZTS"
+fi
+
+changequote({,})
+if test -n "$GCC" && test "$ZEND_INLINE_OPTIMIZATION" != "yes"; then
+  INLINE_CFLAGS=`echo $ac_n "$CFLAGS $ac_c" | sed s/-O[0-9s]*//`
+else
+  INLINE_CFLAGS="$CFLAGS"
+fi
+changequote([,])
+
+AC_C_INLINE
+
+AC_SUBST(INLINE_CFLAGS)
+
+AC_MSG_CHECKING(target system is Darwin)
+if echo "$target" | grep "darwin" > /dev/null; then
+  AC_DEFINE([DARWIN], 1, [Define if the target system is darwin])
+  AC_MSG_RESULT(yes)
+else
+  AC_MSG_RESULT(no)
+fi
+
+dnl test and set the alignment define for ZEND_MM
+dnl this also does the logarithmic test for ZEND_MM.
+AC_MSG_CHECKING(for MM alignment and log values)
+
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdio.h>
+
+typedef union _mm_align_test {
+  void *ptr;
+  double dbl;
+  long lng;
+} mm_align_test;
+
+#if (defined (__GNUC__) && __GNUC__ >= 2)
+#define ZEND_MM_ALIGNMENT (__alignof__ (mm_align_test))
+#else
+#define ZEND_MM_ALIGNMENT (sizeof(mm_align_test))
+#endif
+
+int main()
+{
+  int i = ZEND_MM_ALIGNMENT;
+  int zeros = 0;
+  FILE *fp;
+
+  while (i & ~0x1) {
+    zeros++;
+    i = i >> 1;
+  }
+
+  fp = fopen("conftest.zend", "w");
+  fprintf(fp, "%d %d\n", ZEND_MM_ALIGNMENT, zeros);
+  fclose(fp);
+
+  return 0;
+}
+]])], [
+  LIBZEND_MM_ALIGN=`cat conftest.zend | cut -d ' ' -f 1`
+  LIBZEND_MM_ALIGN_LOG2=`cat conftest.zend | cut -d ' ' -f 2`
+  AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT, $LIBZEND_MM_ALIGN, [ ])
+  AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT_LOG2, $LIBZEND_MM_ALIGN_LOG2, [ ])
+], [], [
+  dnl cross-compile needs something here
+  LIBZEND_MM_ALIGN=8
+])
+
+AC_MSG_RESULT(done)
+
+dnl test for memory allocation using mmap(MAP_ANON)
+AC_MSG_CHECKING(for memory allocation using mmap(MAP_ANON))
+
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <stdlib.h>
+#include <stdio.h>
+#ifndef MAP_ANON
+# ifdef MAP_ANONYMOUS
+#  define MAP_ANON MAP_ANONYMOUS
+# endif
+#endif
+#ifndef MREMAP_MAYMOVE
+# define MREMAP_MAYMOVE 0
+#endif
+#ifndef MAP_FAILED
+# define MAP_FAILED ((void*)-1)
+#endif
+
+#define SEG_SIZE (256*1024)
+
+int main()
+{
+	void *seg = mmap(NULL, SEG_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
+	if (seg == MAP_FAILED) {
+		return 1;
+	}
+	if (munmap(seg, SEG_SIZE) != 0) {
+		return 2;
+	}
+	return 0;
+}
+]])], [
+  AC_DEFINE([HAVE_MEM_MMAP_ANON], 1, [Define if the target system has support for memory allocation using mmap(MAP_ANON)])
+  AC_MSG_RESULT(yes)
+], [
+  AC_MSG_RESULT(no)
+], [
+  dnl cross-compile needs something here
+  AC_MSG_RESULT(no)
+])
+
+dnl test for memory allocation using mmap("/dev/zero")
+AC_MSG_CHECKING(for memory allocation using mmap("/dev/zero"))
+
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#ifndef MAP_ANON
+# ifdef MAP_ANONYMOUS
+#  define MAP_ANON MAP_ANONYMOUS
+# endif
+#endif
+#ifndef MREMAP_MAYMOVE
+# define MREMAP_MAYMOVE 0
+#endif
+#ifndef MAP_FAILED
+# define MAP_FAILED ((void*)-1)
+#endif
+
+#define SEG_SIZE (256*1024)
+
+int main()
+{
+	int fd;
+	void *seg;
+
+	fd = open("/dev/zero", O_RDWR, S_IRUSR | S_IWUSR);
+	if (fd < 0) {
+		return 1;
+	}
+	seg = mmap(NULL, SEG_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
+	if (seg == MAP_FAILED) {
+		return 2;
+	}
+	if (munmap(seg, SEG_SIZE) != 0) {
+		return 3;
+	}
+	if (close(fd) != 0) {
+		return 4;
+	}
+	return 0;
+}
+]])], [
+  AC_DEFINE([HAVE_MEM_MMAP_ZERO], 1, [Define if the target system has support for memory allocation using mmap("/dev/zero")])
+  AC_MSG_RESULT(yes)
+], [
+  AC_MSG_RESULT(no)
+], [
+  dnl cross-compile needs something here
+  AC_MSG_RESULT(no)
+])
+
+AC_CHECK_FUNCS(mremap)
+
+
+AC_ARG_ENABLE(zend-signals,
+[  --disable-zend-signals  whether to enable zend signal handling],[
+  ZEND_SIGNALS=$enableval
+],[
+  ZEND_SIGNALS=yes
+])
+
+AC_CHECK_FUNC(sigaction, [
+	AC_DEFINE(HAVE_SIGACTION, 1, [Whether sigaction() is available])
+], [
+	ZEND_SIGNALS=no
+])
+if test "$ZEND_SIGNALS" = "yes"; then
+	AC_DEFINE(ZEND_SIGNALS, 1, [Use zend signal handling])
+	CFLAGS="$CFLAGS -DZEND_SIGNALS"
+fi
+
+AC_MSG_CHECKING(whether to enable zend signal handling)
+AC_MSG_RESULT($ZEND_SIGNALS)
+
+])
+
+AC_MSG_CHECKING(whether /dev/urandom exists)
+if test -r "/dev/urandom" && test -c "/dev/urandom"; then
+  AC_DEFINE([HAVE_DEV_URANDOM], 1, [Define if the target system has /dev/urandom device])
+  AC_MSG_RESULT(yes)
+else
+  AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING(whether /dev/arandom exists)
+if test -r "/dev/arandom" && test -c "/dev/arandom"; then
+  AC_DEFINE([HAVE_DEV_ARANDOM], 1, [Define if the target system has /dev/arandom device])
+  AC_MSG_RESULT(yes)
+else
+  AC_MSG_RESULT(no)
+fi
+
+AC_ARG_ENABLE(gcc-global-regs,
+[  --disable-gcc-global-regs
+                          whether to enable GCC global register variables],[
+  ZEND_GCC_GLOBAL_REGS=$enableval
+],[
+  ZEND_GCC_GLOBAL_REGS=yes
+])
+AC_MSG_CHECKING(for global register variables support)
+if test "$ZEND_GCC_GLOBAL_REGS" != "no"; then
+  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#if defined(__GNUC__)
+# define ZEND_GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
+#else
+# define ZEND_GCC_VERSION 0
+#endif
+#if defined(__GNUC__) && ZEND_GCC_VERSION >= 4008 && defined(i386)
+# define ZEND_VM_FP_GLOBAL_REG "%esi"
+# define ZEND_VM_IP_GLOBAL_REG "%edi"
+#elif defined(__GNUC__) && ZEND_GCC_VERSION >= 4008 && defined(__x86_64__)
+# define ZEND_VM_FP_GLOBAL_REG "%r14"
+# define ZEND_VM_IP_GLOBAL_REG "%r15"
+#elif defined(__GNUC__) && ZEND_GCC_VERSION >= 4008 && defined(__powerpc64__)
+# define ZEND_VM_FP_GLOBAL_REG "r28"
+# define ZEND_VM_IP_GLOBAL_REG "r29"
+#elif defined(__IBMC__) && ZEND_GCC_VERSION >= 4002 && defined(__powerpc64__)
+# define ZEND_VM_FP_GLOBAL_REG "r28"
+# define ZEND_VM_IP_GLOBAL_REG "r29"
+#else
+# error "global register variables are not supported"
+#endif
+typedef int (*opcode_handler_t)(void);
+register void *FP  __asm__(ZEND_VM_FP_GLOBAL_REG);
+register const opcode_handler_t *IP __asm__(ZEND_VM_IP_GLOBAL_REG);
+int emu(const opcode_handler_t *ip, void *fp) {
+	const opcode_handler_t *orig_ip = IP;
+	void *orig_fp = FP;
+	IP = ip;
+	FP = fp;
+	while ((*ip)());
+	FP = orig_fp;
+	IP = orig_ip;
+}
+  ]], [[
+  ]])], [
+    ZEND_GCC_GLOBAL_REGS=yes
+  ], [
+    ZEND_GCC_GLOBAL_REGS=no
+  ])
+fi
+if test "$ZEND_GCC_GLOBAL_REGS" = "yes"; then
+  AC_DEFINE([HAVE_GCC_GLOBAL_REGS], 1, [Define if the target system has support for global register variables])
+else
+  HAVE_GCC_GLOBAL_REGS=no
+fi
+AC_MSG_RESULT($ZEND_GCC_GLOBAL_REGS)
+
+dnl
+dnl Check if atof() accepts NAN
+dnl
+AC_CACHE_CHECK(whether atof() accepts NAN, ac_cv_atof_accept_nan,[
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <math.h>
+#include <stdlib.h>
+
+#ifdef HAVE_ISNAN
+#define zend_isnan(a) isnan(a)
+#elif defined(HAVE_FPCLASS)
+#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN))
+#else
+#define zend_isnan(a) 0
+#endif
+
+int main(int argc, char** argv)
+{
+	return zend_isnan(atof("NAN")) ? 0 : 1;
+}
+]])],[
+  ac_cv_atof_accept_nan=yes
+],[
+  ac_cv_atof_accept_nan=no
+],[
+  ac_cv_atof_accept_nan=no
+])])
+if test "$ac_cv_atof_accept_nan" = "yes"; then
+  AC_DEFINE([HAVE_ATOF_ACCEPTS_NAN], 1, [whether atof() accepts NAN])
+fi
+
+dnl
+dnl Check if atof() accepts INF
+dnl
+AC_CACHE_CHECK(whether atof() accepts INF, ac_cv_atof_accept_inf,[
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <math.h>
+#include <stdlib.h>
+
+#ifdef HAVE_ISINF
+#define zend_isinf(a) isinf(a)
+#elif defined(INFINITY)
+/* Might not work, but is required by ISO C99 */
+#define zend_isinf(a) (((a)==INFINITY)?1:0)
+#elif defined(HAVE_FPCLASS)
+#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF))
+#else
+#define zend_isinf(a) 0
+#endif
+
+int main(int argc, char** argv)
+{
+	return zend_isinf(atof("INF")) && zend_isinf(atof("-INF")) ? 0 : 1;
+}
+]])],[
+  ac_cv_atof_accept_inf=yes
+],[
+  ac_cv_atof_accept_inf=no
+],[
+  ac_cv_atof_accept_inf=no
+])])
+if test "$ac_cv_atof_accept_inf" = "yes"; then
+  AC_DEFINE([HAVE_ATOF_ACCEPTS_INF], 1, [whether atof() accepts INF])
+fi
+
+dnl
+dnl Check if HUGE_VAL == INF
+dnl
+AC_CACHE_CHECK(whether HUGE_VAL == INF, ac_cv_huge_val_inf,[
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <math.h>
+#include <stdlib.h>
+
+#ifdef HAVE_ISINF
+#define zend_isinf(a) isinf(a)
+#elif defined(INFINITY)
+/* Might not work, but is required by ISO C99 */
+#define zend_isinf(a) (((a)==INFINITY)?1:0)
+#elif defined(HAVE_FPCLASS)
+#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF))
+#else
+#define zend_isinf(a) 0
+#endif
+
+int main(int argc, char** argv)
+{
+	return zend_isinf(HUGE_VAL) ? 0 : 1;
+}
+]])],[
+  ac_cv_huge_val_inf=yes
+],[
+  ac_cv_huge_val_inf=no
+],[
+  ac_cv_huge_val_inf=yes
+])])
+dnl This is the most probable fallback so we assume yes in case of cross compile.
+if test "$ac_cv_huge_val_inf" = "yes"; then
+  AC_DEFINE([HAVE_HUGE_VAL_INF], 1, [whether HUGE_VAL == INF])
+fi
+
+dnl
+dnl Check if HUGE_VAL + -HUGEVAL == NAN
+dnl
+AC_CACHE_CHECK(whether HUGE_VAL + -HUGEVAL == NAN, ac_cv_huge_val_nan,[
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <math.h>
+#include <stdlib.h>
+
+#ifdef HAVE_ISNAN
+#define zend_isnan(a) isnan(a)
+#elif defined(HAVE_FPCLASS)
+#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN))
+#else
+#define zend_isnan(a) 0
+#endif
+
+int main(int argc, char** argv)
+{
+#if defined(__sparc__) && !(__GNUC__ >= 3)
+	/* prevent bug #27830 */
+	return 1;
+#else
+	return zend_isnan(HUGE_VAL + -HUGE_VAL) ? 0 : 1;
+#endif
+}
+]])],[
+  ac_cv_huge_val_nan=yes
+],[
+  ac_cv_huge_val_nan=no
+],[
+  ac_cv_huge_val_nan=yes
+])])
+dnl This is the most probable fallback so we assume yes in case of cross compile.
+if test "$ac_cv_huge_val_nan" = "yes"; then
+  AC_DEFINE([HAVE_HUGE_VAL_NAN], 1, [whether HUGE_VAL + -HUGEVAL == NAN])
+fi
+
+dnl
+dnl Check whether __cpuid_count is available
+dnl
+AC_CACHE_CHECK(whether __cpuid_count is available, ac_cv_cpuid_count_available, [
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+  #include <cpuid.h>
+]], [[
+  unsigned eax, ebx, ecx, edx;
+  __cpuid_count(0, 0, eax, ebx, ecx, edx);
+]])], [
+  ac_cv_cpuid_count_available=yes
+], [
+  ac_cv_cpuid_count_available=no
+])])
+if test "$ac_cv_cpuid_count_available" = "yes"; then
+  AC_DEFINE([HAVE_CPUID_COUNT], 1, [whether __cpuid_count is available])
+fi

+ 228 - 0
EVSE/GPL/php-7.3.28/Zend/acinclude.m4

@@ -0,0 +1,228 @@
+dnl This file contains local autoconf functions.
+
+AC_DEFUN([LIBZEND_BISON_CHECK],[
+  # we only support certain bison versions;
+  # min: 2.4 (i.e. 204, major * 100 + minor for easier comparison)
+  bison_version_min="204"
+  # non-working versions, e.g. "3.0 3.2";
+  # remove "none" when introducing the first incompatible bison version an
+  # separate any following additions by spaces
+  bison_version_exclude=""
+
+  # for standalone build of Zend Engine
+  test -z "$SED" && SED=sed
+
+  bison_version=none
+  if test "$YACC"; then
+    AC_CACHE_CHECK([for bison version], php_cv_bison_version, [
+      bison_version_vars=`$YACC --version 2> /dev/null | grep 'GNU Bison' | cut -d ' ' -f 4 | $SED -e 's/\./ /g' | tr -d a-z`
+      php_cv_bison_version=invalid
+      if test -n "$bison_version_vars"; then
+        set $bison_version_vars
+        bison_version="${1}.${2}"
+        bison_version_num="`expr ${1} \* 100 + ${2}`"
+        if test $bison_version_num -ge $bison_version_min; then
+          php_cv_bison_version="$bison_version (ok)"
+          for bison_check_version in $bison_version_exclude; do
+            if test "$bison_version" = "$bison_check_version"; then
+              php_cv_bison_version=invalid
+              break
+            fi
+          done
+        fi
+      fi
+    ])
+  fi
+  case $php_cv_bison_version in
+    ""|invalid[)]
+      bison_msg="This bison version is not supported for regeneration of the Zend/PHP parsers (found: $bison_version, min: $bison_version_min, excluded: $bison_version_exclude)."
+      AC_MSG_WARN([$bison_msg])
+      YACC="exit 0;"
+      ;;
+  esac
+])
+
+AC_DEFUN([ZEND_FP_EXCEPT],[
+  AC_CACHE_CHECK(whether fp_except is defined, ac_cv_type_fp_except,[
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <floatingpoint.h>
+]],[[
+fp_except x = (fp_except) 0;
+]])],[
+     ac_cv_type_fp_except=yes
+],[
+     ac_cv_type_fp_except=no
+])])
+  if test "$ac_cv_type_fp_except" = "yes"; then
+    AC_DEFINE(HAVE_FP_EXCEPT, 1, [whether floatingpoint.h defines fp_except])
+  fi
+])
+
+dnl
+dnl Check for broken sprintf()
+dnl
+AC_DEFUN([AC_ZEND_BROKEN_SPRINTF],[
+  AC_CACHE_CHECK(whether sprintf is broken, ac_cv_broken_sprintf,[
+    AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdio.h>
+int main() {char buf[20]; return sprintf(buf,"testing 123")!=11; }
+]])],[
+      ac_cv_broken_sprintf=no
+    ],[
+      ac_cv_broken_sprintf=yes
+    ],[
+      ac_cv_broken_sprintf=no
+    ])
+  ])
+  if test "$ac_cv_broken_sprintf" = "yes"; then
+    ac_result=1
+  else
+    ac_result=0
+  fi
+  AC_DEFINE_UNQUOTED(ZEND_BROKEN_SPRINTF, $ac_result, [Whether sprintf is broken])
+])
+
+dnl
+dnl AC_ZEND_C_BIGENDIAN
+dnl Replacement macro for AC_C_BIGENDIAN
+dnl
+AC_DEFUN([AC_ZEND_C_BIGENDIAN],
+[AC_CACHE_CHECK([whether byte ordering is bigendian], ac_cv_c_bigendian_php,
+ [
+  ac_cv_c_bigendian_php=unknown
+  AC_RUN_IFELSE([AC_LANG_SOURCE([[
+int main(void)
+{
+        short one = 1;
+        char *cp = (char *)&one;
+
+        if (*cp == 0) {
+                return(0);
+        } else {
+                return(1);
+        }
+}
+  ]])], [ac_cv_c_bigendian_php=yes], [ac_cv_c_bigendian_php=no], [ac_cv_c_bigendian_php=unknown])
+ ])
+ if test $ac_cv_c_bigendian_php = yes; then
+   AC_DEFINE(WORDS_BIGENDIAN, 1, [Define if processor uses big-endian word])
+ fi
+])
+
+AC_DEFUN([AM_SET_LIBTOOL_VARIABLE],[
+  LIBTOOL='$(SHELL) $(top_builddir)/libtool $1'
+])
+
+dnl x87 floating point internal precision control checks
+dnl See: http://wiki.php.net/rfc/rounding
+AC_DEFUN([ZEND_CHECK_FLOAT_PRECISION],[
+  AC_MSG_CHECKING([for usable _FPU_SETCW])
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+    #include <fpu_control.h>
+  ]],[[
+    fpu_control_t fpu_oldcw, fpu_cw;
+    volatile double result;
+    double a = 2877.0;
+    volatile double b = 1000000.0;
+
+    _FPU_GETCW(fpu_oldcw);
+    fpu_cw = (fpu_oldcw & ~_FPU_EXTENDED & ~_FPU_SINGLE) | _FPU_DOUBLE;
+    _FPU_SETCW(fpu_cw);
+    result = a / b;
+    _FPU_SETCW(fpu_oldcw);
+  ]])],[ac_cfp_have__fpu_setcw=yes],[ac_cfp_have__fpu_setcw=no])
+  if test "$ac_cfp_have__fpu_setcw" = "yes" ; then
+    AC_DEFINE(HAVE__FPU_SETCW, 1, [whether _FPU_SETCW is present and usable])
+    AC_MSG_RESULT(yes)
+  else
+    AC_MSG_RESULT(no)
+  fi
+
+  AC_MSG_CHECKING([for usable fpsetprec])
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+    #include <machine/ieeefp.h>
+  ]],[[
+    fp_prec_t fpu_oldprec;
+    volatile double result;
+    double a = 2877.0;
+    volatile double b = 1000000.0;
+
+    fpu_oldprec = fpgetprec();
+    fpsetprec(FP_PD);
+    result = a / b;
+    fpsetprec(fpu_oldprec);
+  ]])], [ac_cfp_have_fpsetprec=yes], [ac_cfp_have_fpsetprec=no])
+  if test "$ac_cfp_have_fpsetprec" = "yes" ; then
+    AC_DEFINE(HAVE_FPSETPREC, 1, [whether fpsetprec is present and usable])
+    AC_MSG_RESULT(yes)
+  else
+    AC_MSG_RESULT(no)
+  fi
+
+  AC_MSG_CHECKING([for usable _controlfp])
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+    #include <float.h>
+  ]],[[
+    unsigned int fpu_oldcw;
+    volatile double result;
+    double a = 2877.0;
+    volatile double b = 1000000.0;
+
+    fpu_oldcw = _controlfp(0, 0);
+    _controlfp(_PC_53, _MCW_PC);
+    result = a / b;
+    _controlfp(fpu_oldcw, _MCW_PC);
+  ]])], [ac_cfp_have__controlfp=yes], [ac_cfp_have__controlfp=no])
+  if test "$ac_cfp_have__controlfp" = "yes" ; then
+    AC_DEFINE(HAVE__CONTROLFP, 1, [whether _controlfp is present usable])
+    AC_MSG_RESULT(yes)
+  else
+    AC_MSG_RESULT(no)
+  fi
+
+  AC_MSG_CHECKING([for usable _controlfp_s])
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+   #include <float.h>
+  ]],[[
+    unsigned int fpu_oldcw, fpu_cw;
+    volatile double result;
+    double a = 2877.0;
+    volatile double b = 1000000.0;
+
+    _controlfp_s(&fpu_cw, 0, 0);
+    fpu_oldcw = fpu_cw;
+    _controlfp_s(&fpu_cw, _PC_53, _MCW_PC);
+    result = a / b;
+    _controlfp_s(&fpu_cw, fpu_oldcw, _MCW_PC);
+  ]])], [ac_cfp_have__controlfp_s=yes], [ac_cfp_have__controlfp_s=no])
+  if test "$ac_cfp_have__controlfp_s" = "yes" ; then
+    AC_DEFINE(HAVE__CONTROLFP_S, 1, [whether _controlfp_s is present and usable])
+    AC_MSG_RESULT(yes)
+  else
+    AC_MSG_RESULT(no)
+  fi
+
+  AC_MSG_CHECKING([whether FPU control word can be manipulated by inline assembler])
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+    /* nothing */
+  ]],[[
+    unsigned int oldcw, cw;
+    volatile double result;
+    double a = 2877.0;
+    volatile double b = 1000000.0;
+
+    __asm__ __volatile__ ("fnstcw %0" : "=m" (*&oldcw));
+    cw = (oldcw & ~0x0 & ~0x300) | 0x200;
+    __asm__ __volatile__ ("fldcw %0" : : "m" (*&cw));
+
+    result = a / b;
+
+    __asm__ __volatile__ ("fldcw %0" : : "m" (*&oldcw));
+  ]])], [ac_cfp_have_fpu_inline_asm_x86=yes], [ac_cfp_have_fpu_inline_asm_x86=no])
+  if test "$ac_cfp_have_fpu_inline_asm_x86" = "yes" ; then
+    AC_DEFINE(HAVE_FPU_INLINE_ASM_X86, 1, [whether FPU control word can be manipulated by inline assembler])
+    AC_MSG_RESULT(yes)
+  else
+    AC_MSG_RESULT(no)
+  fi
+])

+ 422 - 0
EVSE/GPL/php-7.3.28/Zend/bench.php

@@ -0,0 +1,422 @@
+<?php
+if (function_exists("date_default_timezone_set")) {
+	date_default_timezone_set("UTC");
+}
+
+function simple() {
+  $a = 0;
+  for ($i = 0; $i < 1000000; $i++)
+    $a++;
+
+  $thisisanotherlongname = 0;
+  for ($thisisalongname = 0; $thisisalongname < 1000000; $thisisalongname++)
+    $thisisanotherlongname++;
+}
+
+/****/
+
+function simplecall() {
+  for ($i = 0; $i < 1000000; $i++)
+    strlen("hallo");
+}
+
+/****/
+
+function hallo($a) {
+}
+
+function simpleucall() {
+  for ($i = 0; $i < 1000000; $i++)
+    hallo("hallo");
+}
+
+/****/
+
+function simpleudcall() {
+  for ($i = 0; $i < 1000000; $i++)
+    hallo2("hallo");
+}
+
+function hallo2($a) {
+}
+
+/****/
+
+function mandel() {
+  $w1=50;
+  $h1=150;
+  $recen=-.45;
+  $imcen=0.0;
+  $r=0.7;
+  $s=0;  $rec=0;  $imc=0;  $re=0;  $im=0;  $re2=0;  $im2=0;
+  $x=0;  $y=0;  $w2=0;  $h2=0;  $color=0;
+  $s=2*$r/$w1;
+  $w2=40;
+  $h2=12;
+  for ($y=0 ; $y<=$w1; $y=$y+1) {
+    $imc=$s*($y-$h2)+$imcen;
+    for ($x=0 ; $x<=$h1; $x=$x+1) {
+      $rec=$s*($x-$w2)+$recen;
+      $re=$rec;
+      $im=$imc;
+      $color=1000;
+      $re2=$re*$re;
+      $im2=$im*$im;
+      while( ((($re2+$im2)<1000000) && $color>0)) {
+        $im=$re*$im*2+$imc;
+        $re=$re2-$im2+$rec;
+        $re2=$re*$re;
+        $im2=$im*$im;
+        $color=$color-1;
+      }
+      if ( $color==0 ) {
+        print "_";
+      } else {
+        print "#";
+      }
+    }
+    print "<br>";
+    flush();
+  }
+}
+
+/****/
+
+function mandel2() {
+  $b = " .:,;!/>)|&IH%*#";
+  //float r, i, z, Z, t, c, C;
+  for ($y=30; printf("\n"), $C = $y*0.1 - 1.5, $y--;){
+    for ($x=0; $c = $x*0.04 - 2, $z=0, $Z=0, $x++ < 75;){
+      for ($r=$c, $i=$C, $k=0; $t = $z*$z - $Z*$Z + $r, $Z = 2*$z*$Z + $i, $z=$t, $k<5000; $k++)
+        if ($z*$z + $Z*$Z > 500000) break;
+      echo $b[$k%16];
+    }
+  }
+}
+
+/****/
+
+function Ack($m, $n){
+  if($m == 0) return $n+1;
+  if($n == 0) return Ack($m-1, 1);
+  return Ack($m - 1, Ack($m, ($n - 1)));
+}
+
+function ackermann($n) {
+  $r = Ack(3,$n);
+  print "Ack(3,$n): $r\n";
+}
+
+/****/
+
+function ary($n) {
+  for ($i=0; $i<$n; $i++) {
+    $X[$i] = $i;
+  }
+  for ($i=$n-1; $i>=0; $i--) {
+    $Y[$i] = $X[$i];
+  }
+  $last = $n-1;
+  print "$Y[$last]\n";
+}
+
+/****/
+
+function ary2($n) {
+  for ($i=0; $i<$n;) {
+    $X[$i] = $i; ++$i;
+    $X[$i] = $i; ++$i;
+    $X[$i] = $i; ++$i;
+    $X[$i] = $i; ++$i;
+    $X[$i] = $i; ++$i;
+
+    $X[$i] = $i; ++$i;
+    $X[$i] = $i; ++$i;
+    $X[$i] = $i; ++$i;
+    $X[$i] = $i; ++$i;
+    $X[$i] = $i; ++$i;
+  }
+  for ($i=$n-1; $i>=0;) {
+    $Y[$i] = $X[$i]; --$i;
+    $Y[$i] = $X[$i]; --$i;
+    $Y[$i] = $X[$i]; --$i;
+    $Y[$i] = $X[$i]; --$i;
+    $Y[$i] = $X[$i]; --$i;
+
+    $Y[$i] = $X[$i]; --$i;
+    $Y[$i] = $X[$i]; --$i;
+    $Y[$i] = $X[$i]; --$i;
+    $Y[$i] = $X[$i]; --$i;
+    $Y[$i] = $X[$i]; --$i;
+  }
+  $last = $n-1;
+  print "$Y[$last]\n";
+}
+
+/****/
+
+function ary3($n) {
+  for ($i=0; $i<$n; $i++) {
+    $X[$i] = $i + 1;
+    $Y[$i] = 0;
+  }
+  for ($k=0; $k<1000; $k++) {
+    for ($i=$n-1; $i>=0; $i--) {
+      $Y[$i] += $X[$i];
+    }
+  }
+  $last = $n-1;
+  print "$Y[0] $Y[$last]\n";
+}
+
+/****/
+
+function fibo_r($n){
+    return(($n < 2) ? 1 : fibo_r($n - 2) + fibo_r($n - 1));
+}
+
+function fibo($n) {
+  $r = fibo_r($n);
+  print "$r\n";
+}
+
+/****/
+
+function hash1($n) {
+  for ($i = 1; $i <= $n; $i++) {
+    $X[dechex($i)] = $i;
+  }
+  $c = 0;
+  for ($i = $n; $i > 0; $i--) {
+    if ($X[dechex($i)]) { $c++; }
+  }
+  print "$c\n";
+}
+
+/****/
+
+function hash2($n) {
+  for ($i = 0; $i < $n; $i++) {
+    $hash1["foo_$i"] = $i;
+    $hash2["foo_$i"] = 0;
+  }
+  for ($i = $n; $i > 0; $i--) {
+    foreach($hash1 as $key => $value) $hash2[$key] += $value;
+  }
+  $first = "foo_0";
+  $last  = "foo_".($n-1);
+  print "$hash1[$first] $hash1[$last] $hash2[$first] $hash2[$last]\n";
+}
+
+/****/
+
+function gen_random ($n) {
+    global $LAST;
+    return( ($n * ($LAST = ($LAST * IA + IC) % IM)) / IM );
+}
+
+function heapsort_r($n, &$ra) {
+    $l = ($n >> 1) + 1;
+    $ir = $n;
+
+    while (1) {
+	if ($l > 1) {
+	    $rra = $ra[--$l];
+	} else {
+	    $rra = $ra[$ir];
+	    $ra[$ir] = $ra[1];
+	    if (--$ir == 1) {
+		$ra[1] = $rra;
+		return;
+	    }
+	}
+	$i = $l;
+	$j = $l << 1;
+	while ($j <= $ir) {
+	    if (($j < $ir) && ($ra[$j] < $ra[$j+1])) {
+		$j++;
+	    }
+	    if ($rra < $ra[$j]) {
+		$ra[$i] = $ra[$j];
+		$j += ($i = $j);
+	    } else {
+		$j = $ir + 1;
+	    }
+	}
+	$ra[$i] = $rra;
+    }
+}
+
+function heapsort($N) {
+  global $LAST;
+
+  define("IM", 139968);
+  define("IA", 3877);
+  define("IC", 29573);
+
+  $LAST = 42;
+  for ($i=1; $i<=$N; $i++) {
+    $ary[$i] = gen_random(1);
+  }
+  heapsort_r($N, $ary);
+  printf("%.10f\n", $ary[$N]);
+}
+
+/****/
+
+function mkmatrix ($rows, $cols) {
+    $count = 1;
+    $mx = array();
+    for ($i=0; $i<$rows; $i++) {
+	for ($j=0; $j<$cols; $j++) {
+	    $mx[$i][$j] = $count++;
+	}
+    }
+    return($mx);
+}
+
+function mmult ($rows, $cols, $m1, $m2) {
+    $m3 = array();
+    for ($i=0; $i<$rows; $i++) {
+	for ($j=0; $j<$cols; $j++) {
+	    $x = 0;
+	    for ($k=0; $k<$cols; $k++) {
+		$x += $m1[$i][$k] * $m2[$k][$j];
+	    }
+	    $m3[$i][$j] = $x;
+	}
+    }
+    return($m3);
+}
+
+function matrix($n) {
+  $SIZE = 30;
+  $m1 = mkmatrix($SIZE, $SIZE);
+  $m2 = mkmatrix($SIZE, $SIZE);
+  while ($n--) {
+    $mm = mmult($SIZE, $SIZE, $m1, $m2);
+  }
+  print "{$mm[0][0]} {$mm[2][3]} {$mm[3][2]} {$mm[4][4]}\n";
+}
+
+/****/
+
+function nestedloop($n) {
+  $x = 0;
+  for ($a=0; $a<$n; $a++)
+    for ($b=0; $b<$n; $b++)
+      for ($c=0; $c<$n; $c++)
+        for ($d=0; $d<$n; $d++)
+          for ($e=0; $e<$n; $e++)
+            for ($f=0; $f<$n; $f++)
+             $x++;
+  print "$x\n";
+}
+
+/****/
+
+function sieve($n) {
+  $count = 0;
+  while ($n-- > 0) {
+    $count = 0;
+    $flags = range (0,8192);
+    for ($i=2; $i<8193; $i++) {
+      if ($flags[$i] > 0) {
+        for ($k=$i+$i; $k <= 8192; $k+=$i) {
+          $flags[$k] = 0;
+        }
+        $count++;
+      }
+    }
+  }
+  print "Count: $count\n";
+}
+
+/****/
+
+function strcat($n) {
+  $str = "";
+  while ($n-- > 0) {
+    $str .= "hello\n";
+  }
+  $len = strlen($str);
+  print "$len\n";
+}
+
+/*****/
+
+function gethrtime()
+{
+  $hrtime = hrtime();
+  return (($hrtime[0]*1000000000 + $hrtime[1]) / 1000000000);
+}
+
+function start_test()
+{
+	ob_start();
+  return gethrtime();
+}
+
+function end_test($start, $name)
+{
+  global $total;
+  $end = gethrtime();
+  ob_end_clean();
+  $total += $end-$start;
+  $num = number_format($end-$start,3);
+  $pad = str_repeat(" ", 24-strlen($name)-strlen($num));
+
+  echo $name.$pad.$num."\n";
+	ob_start();
+  return gethrtime();
+}
+
+function total()
+{
+  global $total;
+  $pad = str_repeat("-", 24);
+  echo $pad."\n";
+  $num = number_format($total,3);
+  $pad = str_repeat(" ", 24-strlen("Total")-strlen($num));
+  echo "Total".$pad.$num."\n";
+}
+
+$t0 = $t = start_test();
+simple();
+$t = end_test($t, "simple");
+simplecall();
+$t = end_test($t, "simplecall");
+simpleucall();
+$t = end_test($t, "simpleucall");
+simpleudcall();
+$t = end_test($t, "simpleudcall");
+mandel();
+$t = end_test($t, "mandel");
+mandel2();
+$t = end_test($t, "mandel2");
+ackermann(7);
+$t = end_test($t, "ackermann(7)");
+ary(50000);
+$t = end_test($t, "ary(50000)");
+ary2(50000);
+$t = end_test($t, "ary2(50000)");
+ary3(2000);
+$t = end_test($t, "ary3(2000)");
+fibo(30);
+$t = end_test($t, "fibo(30)");
+hash1(50000);
+$t = end_test($t, "hash1(50000)");
+hash2(500);
+$t = end_test($t, "hash2(500)");
+heapsort(20000);
+$t = end_test($t, "heapsort(20000)");
+matrix(20);
+$t = end_test($t, "matrix(20)");
+nestedloop(12);
+$t = end_test($t, "nestedloop(12)");
+sieve(30);
+$t = end_test($t, "sieve(30)");
+strcat(200000);
+$t = end_test($t, "strcat(200000)");
+total();
+?>

+ 32 - 0
EVSE/GPL/php-7.3.28/Zend/buildconf

@@ -0,0 +1,32 @@
+#!/bin/sh
+
+case "$1" in
+--copy)
+	automake_flags=--copy
+	shift
+;;
+esac
+
+libtoolize --force --automake $automake_flags
+
+mv aclocal.m4 aclocal.m4.old 2>/dev/null
+aclocal
+if cmp aclocal.m4.old aclocal.m4 > /dev/null 2>&1; then
+    echo "buildconf: keeping ${1}aclocal.m4"
+    mv aclocal.m4.old aclocal.m4
+else
+    echo "buildconf: created or modified ${1}aclocal.m4"
+fi
+
+autoheader
+
+automake --add-missing --include-deps $automake_flags
+
+mv configure configure.old 2>/dev/null
+autoconf
+if cmp configure.old configure > /dev/null 2>&1; then
+    echo "buildconf: keeping ${1}configure"
+    mv configure.old configure
+else
+    echo "buildconf: created or modified ${1}configure"
+fi

+ 133 - 0
EVSE/GPL/php-7.3.28/Zend/configure.ac

@@ -0,0 +1,133 @@
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(zend.c)
+AM_INIT_AUTOMAKE(zend, 0.80A, nodefine)
+AM_CONFIG_HEADER(zend_config.h)
+AM_SANITY_CHECK
+AM_MAINTAINER_MODE
+AC_PROG_CC
+AM_PROG_CC_STDC
+ZEND_VERSION=$VERSION
+AC_ZEND_C_BIGENDIAN
+
+AH_TOP([
+#if defined(__GNUC__) && __GNUC__ >= 4
+# define ZEND_API __attribute__ ((visibility("default")))
+# define ZEND_DLEXPORT __attribute__ ((visibility("default")))
+#else
+# define ZEND_API
+# define ZEND_DLEXPORT
+#endif
+
+#define ZEND_DLIMPORT
+
+#undef uint
+#undef ulong
+])
+
+AH_BOTTOM([
+#ifndef ZEND_ACCONFIG_H_NO_C_PROTOS
+
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#ifdef HAVE_IEEEFP_H
+# include <ieeefp.h>
+#endif
+
+#ifdef HAVE_STRING_H
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+
+#if ZEND_BROKEN_SPRINTF
+int zend_sprintf(char *buffer, const char *format, ...);
+#else
+# define zend_sprintf sprintf
+#endif
+
+#include <math.h>
+
+#ifndef zend_isnan
+#if HAVE_DECL_ISNAN && (!defined(__cplusplus) || __cplusplus < 201103L)
+#define zend_isnan(a) isnan(a)
+#elif defined(HAVE_FPCLASS)
+#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN))
+#else
+#define zend_isnan(a) ((a) != (a))
+#endif
+#endif
+
+#if HAVE_DECL_ISINF && (!defined(__cplusplus) || __cplusplus < 201103L)
+#define zend_isinf(a) isinf(a)
+#elif defined(INFINITY)
+/* Might not work, but is required by ISO C99 */
+#define zend_isinf(a) (((a)==INFINITY || (a)==-INFINITY)?1:0)
+#elif defined(HAVE_FPCLASS)
+#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF))
+#else
+#define zend_isinf(a) 0
+#endif
+
+#if HAVE_DECL_ISFINITE && (!defined(__cplusplus) || __cplusplus < 201103L)
+#define zend_finite(a) isfinite(a)
+#elif defined(HAVE_FINITE)
+#define zend_finite(a) finite(a)
+#elif defined(fpclassify)
+#define zend_finite(a) ((fpclassify((a))!=FP_INFINITE&&fpclassify((a))!=FP_NAN)?1:0)
+#else
+#define zend_finite(a) (zend_isnan(a) ? 0 : zend_isinf(a) ? 0 : 1)
+#endif
+
+#endif /* ifndef ZEND_ACCONFIG_H_NO_C_PROTOS */
+
+])
+
+dnl We want this one before the checks, so the checks can modify CFLAGS.
+test -z "$CFLAGS" && auto_cflags=1
+
+AC_CHECK_SIZEOF(long, 8)
+AC_CHECK_SIZEOF(int, 4)
+
+sinclude(Zend.m4)
+
+LIBZEND_BASIC_CHECKS
+LIBZEND_LIBDL_CHECKS
+LIBZEND_DLSYM_CHECK
+
+AM_PROG_LIBTOOL
+if test "$enable_debug" != "yes"; then
+  AM_SET_LIBTOOL_VARIABLE([--silent])
+fi
+
+dnl
+dnl Check for /usr/pkg/{lib,include} which is where NetBSD puts binary
+dnl and source packages.  This should be harmless on other OSs.
+dnl
+if test -d /usr/pkg/include -a -d /usr/pkg/lib ; then
+       CFLAGS="$CFLAGS -I/usr/pkg/include"
+       LDFLAGS="$LDFLAGS -L/usr/pkg/lib"
+fi
+
+LIBZEND_ENABLE_DEBUG
+LIBZEND_OTHER_CHECKS
+
+ZEND_EXTRA_LIBS="$LIBS"
+LIBS=""
+AC_SUBST(ZEND_EXTRA_LIBS)
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
+
+# Local Variables:
+# tab-width: 4
+# End:

+ 17 - 0
EVSE/GPL/php-7.3.28/Zend/header

@@ -0,0 +1,17 @@
+/*
+   +----------------------------------------------------------------------+
+   | Zend Engine                                                          |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1998-2010 Zend Technologies Ltd. (http://www.zend.com) |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.00 of the Zend license,     |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available through the world-wide-web at the following url:           |
+   | http://www.zend.com/license/2_00.txt.                                |
+   | If you did not receive a copy of the Zend license and are unable to  |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@zend.com so we can mail you a copy immediately.              |
+   +----------------------------------------------------------------------+
+   | Authors:                                                             |
+   +----------------------------------------------------------------------+
+*/

+ 358 - 0
EVSE/GPL/php-7.3.28/Zend/micro_bench.php

@@ -0,0 +1,358 @@
+<?php
+
+function hallo() {
+}
+
+function simpleucall($n) {
+  for ($i = 0; $i < $n; $i++)
+    hallo();
+}
+
+function simpleudcall($n) {
+  for ($i = 0; $i < $n; $i++)
+    hallo2();
+}
+
+function hallo2() {
+}
+
+function simpleicall($n) {
+  for ($i = 0; $i < $n; $i++)
+    func_num_args();
+}
+
+class Foo {
+	static $a = 0;
+	public $b = 0;
+	const TEST = 0;
+
+	static function read_static($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			$x = self::$a;
+		}
+	}
+
+	static function write_static($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			self::$a = 0;
+		}
+	}
+
+	static function isset_static($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			$x = isset(self::$a);
+		}
+	}
+
+	static function empty_static($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			$x = empty(self::$a);
+		}
+	}
+
+	static function f() {
+	}
+
+	static function call_static($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			self::f();
+		}
+	}
+
+	function read_prop($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			$x = $this->b;
+		}
+	}
+
+	function write_prop($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			$this->b = 0;
+		}
+	}
+
+	function assign_add_prop($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			$this->b += 2;
+		}
+	}
+
+	function pre_inc_prop($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			++$this->b;
+		}
+	}
+
+	function pre_dec_prop($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			--$this->b;
+		}
+	}
+
+	function post_inc_prop($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			$this->b++;
+		}
+	}
+
+	function post_dec_prop($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			$this->b--;
+		}
+	}
+
+	function isset_prop($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			$x = isset($this->b);
+		}
+	}
+
+	function empty_prop($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			$x = empty($this->b);
+		}
+	}
+
+	function g() {
+	}
+
+	function call($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			$this->g();
+		}
+	}
+
+	function read_const($n) {
+		for ($i = 0; $i < $n; ++$i) {
+			$x = $this::TEST;
+		}
+	}
+
+}
+
+function read_static($n) {
+	for ($i = 0; $i < $n; ++$i) {
+		$x = Foo::$a;
+	}
+}
+
+function write_static($n) {
+	for ($i = 0; $i < $n; ++$i) {
+		Foo::$a = 0;
+	}
+}
+
+function isset_static($n) {
+	for ($i = 0; $i < $n; ++$i) {
+		$x = isset(Foo::$a);
+	}
+}
+
+function empty_static($n) {
+	for ($i = 0; $i < $n; ++$i) {
+		$x = empty(Foo::$a);
+	}
+}
+
+function call_static($n) {
+	for ($i = 0; $i < $n; ++$i) {
+		Foo::f();
+	}
+}
+
+function create_object($n) {
+	for ($i = 0; $i < $n; ++$i) {
+		$x = new Foo();
+	}
+}
+
+define('TEST', null);
+
+function read_const($n) {
+	for ($i = 0; $i < $n; ++$i) {
+		$x = TEST;
+	}
+}
+
+function read_auto_global($n) {
+	for ($i = 0; $i < $n; ++$i) {
+		$x = $_GET;
+	}
+}
+
+$g_var = 0;
+
+function read_global_var($n) {
+	for ($i = 0; $i < $n; ++$i) {
+		$x = $GLOBALS['g_var'];
+	}
+}
+
+function read_hash($n) {
+	$hash = array('test' => 0);
+	for ($i = 0; $i < $n; ++$i) {
+		$x = $hash['test'];
+	}
+}
+
+function read_str_offset($n) {
+	$str = "test";
+	for ($i = 0; $i < $n; ++$i) {
+		$x = $str[1];
+	}
+}
+
+function issetor($n) {
+	$val = array(0,1,2,3,4,5,6,7,8,9);
+	for ($i = 0; $i < $n; ++$i) {
+		$x = $val ?: null;
+	}
+}
+
+function issetor2($n) {
+	$f = false; $j = 0;
+	for ($i = 0; $i < $n; ++$i) {
+		$x = $f ?: $j + 1;
+	}
+}
+
+function ternary($n) {
+	$val = array(0,1,2,3,4,5,6,7,8,9);
+	$f = false;
+	for ($i = 0; $i < $n; ++$i) {
+		$x = $f ? null : $val;
+	}
+}
+
+function ternary2($n) {
+	$f = false; $j = 0;
+	for ($i = 0; $i < $n; ++$i) {
+		$x = $f ? $f : $j + 1;
+	}
+}
+
+/*****/
+
+function empty_loop($n) {
+	for ($i = 0; $i < $n; ++$i) {
+	}
+}
+
+function gethrtime()
+{
+  $hrtime = hrtime();
+  return (($hrtime[0]*1000000000 + $hrtime[1]) / 1000000000);
+}
+
+function start_test()
+{
+  ob_start();
+  return gethrtime();
+}
+
+function end_test($start, $name, $overhead = null)
+{
+  global $total;
+  global $last_time;
+  $end = gethrtime();
+  ob_end_clean();
+  $last_time = $end-$start;
+  $total += $last_time;
+  $num = number_format($last_time,3);
+  $pad = str_repeat(" ", 24-strlen($name)-strlen($num));
+  if (is_null($overhead)) {
+    echo $name.$pad.$num."\n";
+  } else {
+    $num2 = number_format($last_time - $overhead,3);
+    echo $name.$pad.$num."    ".$num2."\n";
+  }
+  ob_start();
+  return gethrtime();
+}
+
+function total()
+{
+  global $total;
+  $pad = str_repeat("-", 24);
+  echo $pad."\n";
+  $num = number_format($total,3);
+  $pad = str_repeat(" ", 24-strlen("Total")-strlen($num));
+  echo "Total".$pad.$num."\n";
+}
+
+const N = 5000000;
+
+$t0 = $t = start_test();
+empty_loop(N);
+$t = end_test($t, 'empty_loop');
+$overhead = $last_time;
+simpleucall(N);
+$t = end_test($t, 'func()', $overhead);
+simpleudcall(N);
+$t = end_test($t, 'undef_func()', $overhead);
+simpleicall(N);
+$t = end_test($t, 'int_func()', $overhead);
+Foo::read_static(N);
+$t = end_test($t, '$x = self::$x', $overhead);
+Foo::write_static(N);
+$t = end_test($t, 'self::$x = 0', $overhead);
+Foo::isset_static(N);
+$t = end_test($t, 'isset(self::$x)', $overhead);
+Foo::empty_static(N);
+$t = end_test($t, 'empty(self::$x)', $overhead);
+read_static(N);
+$t = end_test($t, '$x = Foo::$x', $overhead);
+write_static(N);
+$t = end_test($t, 'Foo::$x = 0', $overhead);
+isset_static(N);
+$t = end_test($t, 'isset(Foo::$x)', $overhead);
+empty_static(N);
+$t = end_test($t, 'empty(Foo::$x)', $overhead);
+Foo::call_static(N);
+$t = end_test($t, 'self::f()', $overhead);
+call_static(N);
+$t = end_test($t, 'Foo::f()', $overhead);
+$x = new Foo();
+$x->read_prop(N);
+$t = end_test($t, '$x = $this->x', $overhead);
+$x->write_prop(N);
+$t = end_test($t, '$this->x = 0', $overhead);
+$x->assign_add_prop(N);
+$t = end_test($t, '$this->x += 2', $overhead);
+$x->pre_inc_prop(N);
+$t = end_test($t, '++$this->x', $overhead);
+$x->pre_dec_prop(N);
+$t = end_test($t, '--$this->x', $overhead);
+$x->post_inc_prop(N);
+$t = end_test($t, '$this->x++', $overhead);
+$x->post_dec_prop(N);
+$t = end_test($t, '$this->x--', $overhead);
+$x->isset_prop(N);
+$t = end_test($t, 'isset($this->x)', $overhead);
+$x->empty_prop(N);
+$t = end_test($t, 'empty($this->x)', $overhead);
+$x->call(N);
+$t = end_test($t, '$this->f()', $overhead);
+$x->read_const(N);
+$t = end_test($t, '$x = Foo::TEST', $overhead);
+create_object(N);
+$t = end_test($t, 'new Foo()', $overhead);
+read_const(N);
+$t = end_test($t, '$x = TEST', $overhead);
+read_auto_global(N);
+$t = end_test($t, '$x = $_GET', $overhead);
+read_global_var(N);
+$t = end_test($t, '$x = $GLOBALS[\'v\']', $overhead);
+read_hash(N);
+$t = end_test($t, '$x = $hash[\'v\']', $overhead);
+read_str_offset(N);
+$t = end_test($t, '$x = $str[0]', $overhead);
+issetor(N);
+$t = end_test($t, '$x = $a ?: null', $overhead);
+issetor2(N);
+$t = end_test($t, '$x = $f ?: tmp', $overhead);
+ternary(N);
+$t = end_test($t, '$x = $f ? $f : $a', $overhead);
+ternary2(N);
+$t = end_test($t, '$x = $f ? $f : tmp', $overhead);
+total($t0, "Total");

+ 59 - 0
EVSE/GPL/php-7.3.28/Zend/tests/001.phpt

@@ -0,0 +1,59 @@
+--TEST--
+func_num_args() tests
+--FILE--
+<?php
+
+function test1() {
+	var_dump(func_num_args());
+}
+
+function test2($a) {
+	var_dump(func_num_args());
+}
+
+function test3($a, $b) {
+	var_dump(func_num_args());
+}
+
+test1();
+test2(1);
+try {
+	test2();
+} catch (Throwable $e) {
+	echo "Exception: " . $e->getMessage() . "\n";
+}
+
+test3(1,2);
+
+call_user_func("test1");
+try {
+	call_user_func("test3", 1);
+} catch (Throwable $e) {
+	echo "Exception: " . $e->getMessage() . "\n";
+}
+call_user_func("test3", 1, 2);
+
+class test {
+	static function test1($a) {
+		var_dump(func_num_args());
+	}
+}
+
+test::test1(1);
+var_dump(func_num_args());
+
+echo "Done\n";
+?>
+--EXPECTF--
+int(0)
+int(1)
+Exception: Too few arguments to function test2(), 0 passed in %s001.php on line 18 and exactly 1 expected
+int(2)
+int(0)
+Exception: Too few arguments to function test3(), 1 passed in %s001.php on line 27 and exactly 2 expected
+int(2)
+int(1)
+
+Warning: func_num_args():  Called from the global scope - no function context in %s on line %d
+int(-1)
+Done

+ 101 - 0
EVSE/GPL/php-7.3.28/Zend/tests/002.phpt

@@ -0,0 +1,101 @@
+--TEST--
+func_get_arg() tests
+--FILE--
+<?php
+
+function test1() {
+	var_dump(func_get_arg(-10));
+	var_dump(func_get_arg(0));
+	var_dump(func_get_arg(1));
+}
+
+function test2($a) {
+	var_dump(func_get_arg(0));
+	var_dump(func_get_arg(1));
+}
+
+function test3($a, $b) {
+	var_dump(func_get_arg(0));
+	var_dump(func_get_arg(1));
+	var_dump(func_get_arg(2));
+}
+
+test1();
+test1(10);
+test2(1);
+try {
+	test2();
+} catch (Throwable $e) {
+	echo "Exception: " . $e->getMessage() . "\n";
+}
+test3(1,2);
+
+call_user_func("test1");
+try {
+	call_user_func("test3", 1);
+} catch (Throwable $e) {
+	echo "Exception: " . $e->getMessage() . "\n";
+}
+call_user_func("test3", 1, 2);
+
+class test {
+	static function test1($a) {
+		var_dump(func_get_arg(0));
+		var_dump(func_get_arg(1));
+	}
+}
+
+test::test1(1);
+var_dump(func_get_arg(1));
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: func_get_arg():  The argument number should be >= 0 in %s on line %d
+bool(false)
+
+Warning: func_get_arg():  Argument 0 not passed to function in %s on line %d
+bool(false)
+
+Warning: func_get_arg():  Argument 1 not passed to function in %s on line %d
+bool(false)
+
+Warning: func_get_arg():  The argument number should be >= 0 in %s on line %d
+bool(false)
+int(10)
+
+Warning: func_get_arg():  Argument 1 not passed to function in %s on line %d
+bool(false)
+int(1)
+
+Warning: func_get_arg():  Argument 1 not passed to function in %s on line %d
+bool(false)
+Exception: Too few arguments to function test2(), 0 passed in %s002.php on line %d and exactly 1 expected
+int(1)
+int(2)
+
+Warning: func_get_arg():  Argument 2 not passed to function in %s on line %d
+bool(false)
+
+Warning: func_get_arg():  The argument number should be >= 0 in %s on line %d
+bool(false)
+
+Warning: func_get_arg():  Argument 0 not passed to function in %s on line %d
+bool(false)
+
+Warning: func_get_arg():  Argument 1 not passed to function in %s on line %d
+bool(false)
+Exception: Too few arguments to function test3(), 1 passed in %s002.php on line %d and exactly 2 expected
+int(1)
+int(2)
+
+Warning: func_get_arg():  Argument 2 not passed to function in %s on line %d
+bool(false)
+int(1)
+
+Warning: func_get_arg():  Argument 1 not passed to function in %s on line %d
+bool(false)
+
+Warning: func_get_arg():  Called from the global scope - no function context in %s on line %d
+bool(false)
+Done

+ 81 - 0
EVSE/GPL/php-7.3.28/Zend/tests/003.phpt

@@ -0,0 +1,81 @@
+--TEST--
+func_get_args() tests
+--FILE--
+<?php
+
+function test1() {
+	var_dump(func_get_args());
+}
+
+function test2($a) {
+	var_dump(func_get_args());
+}
+
+function test3($a, $b) {
+	var_dump(func_get_args());
+}
+
+test1();
+test1(10);
+test2(1);
+try {
+	test2();
+} catch (Throwable $e) {
+	echo "Exception: " . $e->getMessage() . "\n";
+}
+test3(1,2);
+
+call_user_func("test1");
+try {
+	call_user_func("test3", 1);
+} catch (Throwable $e) {
+	echo "Exception: " . $e->getMessage() . "\n";
+}
+call_user_func("test3", 1, 2);
+
+class test {
+	static function test1($a) {
+		var_dump(func_get_args());
+	}
+}
+
+test::test1(1);
+var_dump(func_get_args());
+
+echo "Done\n";
+?>
+--EXPECTF--
+array(0) {
+}
+array(1) {
+  [0]=>
+  int(10)
+}
+array(1) {
+  [0]=>
+  int(1)
+}
+Exception: Too few arguments to function test2(), 0 passed in %s003.php on line %d and exactly 1 expected
+array(2) {
+  [0]=>
+  int(1)
+  [1]=>
+  int(2)
+}
+array(0) {
+}
+Exception: Too few arguments to function test3(), 1 passed in %s003.php on line %d and exactly 2 expected
+array(2) {
+  [0]=>
+  int(1)
+  [1]=>
+  int(2)
+}
+array(1) {
+  [0]=>
+  int(1)
+}
+
+Warning: func_get_args():  Called from the global scope - no function context in %s on line %d
+bool(false)
+Done

+ 25 - 0
EVSE/GPL/php-7.3.28/Zend/tests/004.phpt

@@ -0,0 +1,25 @@
+--TEST--
+strncmp() tests
+--FILE--
+<?php
+
+var_dump(strncmp("", ""));
+var_dump(strncmp("", "", 100));
+var_dump(strncmp("aef", "dfsgbdf", -1));
+var_dump(strncmp("fghjkl", "qwer", 0));
+var_dump(strncmp("qwerty", "qwerty123", 6));
+var_dump(strncmp("qwerty", "qwerty123", 7));
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: strncmp() expects exactly 3 parameters, 2 given in %s on line %d
+NULL
+int(0)
+
+Warning: Length must be greater than or equal to 0 in %s on line %d
+bool(false)
+int(0)
+int(0)
+int(-1)
+Done

+ 27 - 0
EVSE/GPL/php-7.3.28/Zend/tests/005.phpt

@@ -0,0 +1,27 @@
+--TEST--
+strcasecmp() tests
+--FILE--
+<?php
+
+var_dump(strcasecmp(""));
+var_dump(strcasecmp("", ""));
+var_dump(strcasecmp("aef", "dfsgbdf"));
+var_dump(strcasecmp("qwe", "qwer"));
+var_dump(strcasecmp("qwerty", "QweRty"));
+var_dump(strcasecmp("qwErtY", "qwerty"));
+var_dump(strcasecmp("q123", "Q123"));
+var_dump(strcasecmp("01", "01"));
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: strcasecmp() expects exactly 2 parameters, 1 given in %s on line %d
+NULL
+int(0)
+int(-3)
+int(-1)
+int(0)
+int(0)
+int(0)
+int(0)
+Done

+ 31 - 0
EVSE/GPL/php-7.3.28/Zend/tests/006.phpt

@@ -0,0 +1,31 @@
+--TEST--
+strncasecmp() tests
+--FILE--
+<?php
+
+var_dump(strncasecmp(""));
+var_dump(strncasecmp("", "", -1));
+var_dump(strncasecmp("aef", "dfsgbdf", 0));
+var_dump(strncasecmp("aef", "dfsgbdf", 10));
+var_dump(strncasecmp("qwe", "qwer", 3));
+var_dump(strncasecmp("qwerty", "QweRty", 6));
+var_dump(strncasecmp("qwErtY", "qwer", 7));
+var_dump(strncasecmp("q123", "Q123", 3));
+var_dump(strncasecmp("01", "01", 1000));
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: strncasecmp() expects exactly 3 parameters, 1 given in %s on line %d
+NULL
+
+Warning: Length must be greater than or equal to 0 in %s on line %d
+bool(false)
+int(0)
+int(-3)
+int(0)
+int(0)
+int(2)
+int(0)
+int(0)
+Done

+ 65 - 0
EVSE/GPL/php-7.3.28/Zend/tests/007.phpt

@@ -0,0 +1,65 @@
+--TEST--
+each() tests
+--FILE--
+<?php
+
+var_dump(each());
+$var = 1;
+var_dump(each($var));
+$var = "string";
+var_dump(each($var));
+$var = array(1,2,3);
+var_dump(each($var));
+$var = array("a"=>1,"b"=>2,"c"=>3);
+var_dump(each($var));
+
+$a = array(1);
+$a [] =&$a[0];
+
+var_dump(each($a));
+
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: each() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+Deprecated: The each() function is deprecated. This message will be suppressed on further calls in %s on line %d
+
+Warning: Variable passed to each() is not an array or object in %s on line %d
+NULL
+
+Warning: Variable passed to each() is not an array or object in %s on line %d
+NULL
+array(4) {
+  [1]=>
+  int(1)
+  ["value"]=>
+  int(1)
+  [0]=>
+  int(0)
+  ["key"]=>
+  int(0)
+}
+array(4) {
+  [1]=>
+  int(1)
+  ["value"]=>
+  int(1)
+  [0]=>
+  string(1) "a"
+  ["key"]=>
+  string(1) "a"
+}
+array(4) {
+  [1]=>
+  int(1)
+  ["value"]=>
+  int(1)
+  [0]=>
+  int(0)
+  ["key"]=>
+  int(0)
+}
+Done

+ 53 - 0
EVSE/GPL/php-7.3.28/Zend/tests/008.phpt

@@ -0,0 +1,53 @@
+--TEST--
+define() tests
+--FILE--
+<?php
+
+var_dump(define());
+var_dump(define("TRUE"));
+var_dump(define("TRUE", 1));
+var_dump(define("TRUE", 1, array(1)));
+
+var_dump(define(array(1,2,3,4,5), 1));
+var_dump(define(" ", 1));
+var_dump(define("[[[", 2));
+var_dump(define("test const", 3));
+var_dump(define("test const", 3));
+var_dump(define("test", array(1)));
+var_dump(define("test1", fopen(__FILE__, 'r')));
+var_dump(define("test2", new stdclass));
+
+var_dump(constant(" "));
+var_dump(constant("[[["));
+var_dump(constant("test const"));
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: define() expects at least 2 parameters, 0 given in %s on line %d
+NULL
+
+Warning: define() expects at least 2 parameters, 1 given in %s on line %d
+NULL
+bool(true)
+
+Warning: define() expects parameter 3 to be bool, array given in %s on line %d
+NULL
+
+Warning: define() expects parameter 1 to be string, array given in %s on line %d
+NULL
+bool(true)
+bool(true)
+bool(true)
+
+Notice: Constant test const already defined in %s on line %d
+bool(false)
+bool(true)
+bool(true)
+
+Warning: Constants may only evaluate to scalar values, arrays or resources in %s on line %d
+bool(false)
+int(1)
+int(2)
+int(3)
+Done

+ 57 - 0
EVSE/GPL/php-7.3.28/Zend/tests/009.phpt

@@ -0,0 +1,57 @@
+--TEST--
+get_class() tests
+--FILE--
+<?php
+
+class foo {
+	function bar () {
+		var_dump(get_class());
+	}
+    function testNull ()
+    {
+        var_dump(get_class(null));
+    }
+}
+
+class foo2 extends foo {
+}
+
+foo::bar();
+foo2::bar();
+
+$f1 = new foo;
+$f2 = new foo2;
+
+$f1->bar();
+$f2->bar();
+
+var_dump(get_class());
+var_dump(get_class("qwerty"));
+
+var_dump(get_class($f1));
+var_dump(get_class($f2));
+
+$f1->testNull();
+
+echo "Done\n";
+?>
+--EXPECTF--
+Deprecated: Non-static method foo::bar() should not be called statically in %s on line %d
+string(3) "foo"
+
+Deprecated: Non-static method foo::bar() should not be called statically in %s on line %d
+string(3) "foo"
+string(3) "foo"
+string(3) "foo"
+
+Warning: get_class() called without object from outside a class in %s on line %d
+bool(false)
+
+Warning: get_class() expects parameter 1 to be object, string given in %s on line %d
+bool(false)
+string(3) "foo"
+string(4) "foo2"
+
+Warning: get_class() expects parameter 1 to be object, null given in %s on line %d
+bool(false)
+Done

+ 59 - 0
EVSE/GPL/php-7.3.28/Zend/tests/010.phpt

@@ -0,0 +1,59 @@
+--TEST--
+get_parent_class() tests
+--FILE--
+<?php
+
+interface i {
+	function test();
+}
+
+class foo implements i {
+	function test() {
+		var_dump(get_parent_class());
+	}
+}
+
+class bar extends foo {
+	function test_bar() {
+		var_dump(get_parent_class());
+	}
+}
+
+$bar = new bar;
+$foo = new foo;
+
+$foo->test();
+$bar->test();
+$bar->test_bar();
+
+var_dump(get_parent_class($bar));
+var_dump(get_parent_class($foo));
+var_dump(get_parent_class("bar"));
+var_dump(get_parent_class("foo"));
+var_dump(get_parent_class("i"));
+
+var_dump(get_parent_class(""));
+var_dump(get_parent_class("[[[["));
+var_dump(get_parent_class(" "));
+var_dump(get_parent_class(new stdclass));
+var_dump(get_parent_class(array()));
+var_dump(get_parent_class(1));
+
+echo "Done\n";
+?>
+--EXPECT--
+bool(false)
+bool(false)
+string(3) "foo"
+string(3) "foo"
+bool(false)
+string(3) "foo"
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+Done

+ 89 - 0
EVSE/GPL/php-7.3.28/Zend/tests/011.phpt

@@ -0,0 +1,89 @@
+--TEST--
+property_exists() tests
+--FILE--
+<?php
+
+class foo {
+	public $pp1 = 1;
+	private $pp2 = 2;
+	protected $pp3 = 3;
+
+	function bar() {
+		var_dump(property_exists("foo","pp1"));
+		var_dump(property_exists("foo","pp2"));
+		var_dump(property_exists("foo","pp3"));
+	}
+}
+
+class bar extends foo {
+	function test() {
+		var_dump(property_exists("foo","pp1"));
+		var_dump(property_exists("foo","pp2"));
+		var_dump(property_exists("foo","pp3"));
+	}
+}
+
+var_dump(property_exists());
+var_dump(property_exists(""));
+var_dump(property_exists("foo","pp1"));
+var_dump(property_exists("foo","pp2"));
+var_dump(property_exists("foo","pp3"));
+var_dump(property_exists("foo","nonexistent"));
+var_dump(property_exists("fo","nonexistent"));
+var_dump(property_exists("foo",""));
+var_dump(property_exists("","test"));
+var_dump(property_exists("",""));
+
+$foo = new foo;
+
+var_dump(property_exists($foo,"pp1"));
+var_dump(property_exists($foo,"pp2"));
+var_dump(property_exists($foo,"pp3"));
+var_dump(property_exists($foo,"nonexistent"));
+var_dump(property_exists($foo,""));
+var_dump(property_exists(array(),"test"));
+var_dump(property_exists(1,"test"));
+var_dump(property_exists(true,"test"));
+
+$foo->bar();
+
+$bar = new bar;
+$bar->test();
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: property_exists() expects exactly 2 parameters, 0 given in %s on line %d
+NULL
+
+Warning: property_exists() expects exactly 2 parameters, 1 given in %s on line %d
+NULL
+bool(true)
+bool(true)
+bool(true)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(true)
+bool(true)
+bool(false)
+bool(false)
+
+Warning: First parameter must either be an object or the name of an existing class in %s on line %d
+NULL
+
+Warning: First parameter must either be an object or the name of an existing class in %s on line %d
+NULL
+
+Warning: First parameter must either be an object or the name of an existing class in %s on line %d
+NULL
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+Done

+ 34 - 0
EVSE/GPL/php-7.3.28/Zend/tests/012.phpt

@@ -0,0 +1,34 @@
+--TEST--
+class_exists() tests
+--FILE--
+<?php
+
+class foo {
+}
+
+var_dump(class_exists());
+var_dump(class_exists("qwerty"));
+var_dump(class_exists(""));
+var_dump(class_exists(array()));
+var_dump(class_exists("test", false));
+var_dump(class_exists("foo", false));
+var_dump(class_exists("foo"));
+var_dump(class_exists("stdClass", false));
+var_dump(class_exists("stdClass"));
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: class_exists() expects at least 1 parameter, 0 given in %s on line %d
+NULL
+bool(false)
+bool(false)
+
+Warning: class_exists() expects parameter 1 to be string, array given in %s on line %d
+NULL
+bool(false)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+Done

+ 34 - 0
EVSE/GPL/php-7.3.28/Zend/tests/013.phpt

@@ -0,0 +1,34 @@
+--TEST--
+interface_exists() tests
+--FILE--
+<?php
+
+interface foo {
+}
+
+var_dump(interface_exists());
+var_dump(interface_exists("qwerty"));
+var_dump(interface_exists(""));
+var_dump(interface_exists(array()));
+var_dump(interface_exists("test", false));
+var_dump(interface_exists("foo", false));
+var_dump(interface_exists("foo"));
+var_dump(interface_exists("stdClass", false));
+var_dump(interface_exists("stdClass"));
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: interface_exists() expects at least 1 parameter, 0 given in %s on line %d
+NULL
+bool(false)
+bool(false)
+
+Warning: interface_exists() expects parameter 1 to be string, array given in %s on line %d
+NULL
+bool(false)
+bool(true)
+bool(true)
+bool(false)
+bool(false)
+Done

+ 3 - 0
EVSE/GPL/php-7.3.28/Zend/tests/014.inc

@@ -0,0 +1,3 @@
+<?php
+/* dummy file for 014.phpt */
+?>

+ 52 - 0
EVSE/GPL/php-7.3.28/Zend/tests/014.phpt

@@ -0,0 +1,52 @@
+--TEST--
+get_included_files() tests
+--FILE--
+<?php
+
+var_dump(get_included_files());
+
+include(dirname(__FILE__)."/014.inc");
+var_dump(get_included_files());
+
+var_dump(get_included_files(1,1));
+
+include_once(dirname(__FILE__)."/014.inc");
+var_dump(get_included_files());
+
+var_dump(get_included_files(1));
+
+include(dirname(__FILE__)."/014.inc");
+var_dump(get_included_files());
+
+echo "Done\n";
+?>
+--EXPECTF--
+array(1) {
+  [0]=>
+  string(%d) "%s"
+}
+array(2) {
+  [0]=>
+  string(%d) "%s"
+  [1]=>
+  string(%d) "%s"
+}
+
+Warning: get_included_files() expects exactly 0 parameters, 2 given in %s on line %d
+NULL
+array(2) {
+  [0]=>
+  string(%d) "%s"
+  [1]=>
+  string(%d) "%s"
+}
+
+Warning: get_included_files() expects exactly 0 parameters, 1 given in %s on line %d
+NULL
+array(2) {
+  [0]=>
+  string(%d) "%s"
+  [1]=>
+  string(%d) "%s"
+}
+Done

+ 37 - 0
EVSE/GPL/php-7.3.28/Zend/tests/015.phpt

@@ -0,0 +1,37 @@
+--TEST--
+trigger_error() tests
+--FILE--
+<?php
+
+var_dump(trigger_error());
+var_dump(trigger_error("error"));
+var_dump(trigger_error(array()));
+var_dump(trigger_error("error", -1));
+var_dump(trigger_error("error", 0));
+var_dump(trigger_error("error", E_USER_WARNING));
+var_dump(trigger_error("error", E_USER_DEPRECATED));
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: trigger_error() expects at least 1 parameter, 0 given in %s on line %d
+NULL
+
+Notice: error in %s on line %d
+bool(true)
+
+Warning: trigger_error() expects parameter 1 to be string, array given in %s on line %d
+NULL
+
+Warning: Invalid error type specified in %s on line %d
+bool(false)
+
+Warning: Invalid error type specified in %s on line %d
+bool(false)
+
+Warning: error in %s on line %d
+bool(true)
+
+Deprecated: error in %s on line %d
+bool(true)
+Done

+ 12 - 0
EVSE/GPL/php-7.3.28/Zend/tests/016.phpt

@@ -0,0 +1,12 @@
+--TEST--
+isset() with object properties when operating on non-object
+--FILE--
+<?php
+
+$foo = NULL;
+isset($foo->bar->bar);
+
+echo "Done\n";
+?>
+--EXPECT--
+Done

+ 82 - 0
EVSE/GPL/php-7.3.28/Zend/tests/017.phpt

@@ -0,0 +1,82 @@
+--TEST--
+builtin functions tests
+--FILE--
+<?php
+
+var_dump(get_resource_type());
+var_dump(get_resource_type(""));
+$fp = fopen(__FILE__, "r");
+var_dump(get_resource_type($fp));
+fclose($fp);
+var_dump(get_resource_type($fp));
+
+var_dump(gettype(get_loaded_extensions()));
+var_dump(count(get_loaded_extensions()));
+var_dump(gettype(get_loaded_extensions(true)));
+var_dump(count(get_loaded_extensions(true)));
+var_dump(get_loaded_extensions(true, true));
+
+define("USER_CONSTANT", "test");
+
+var_dump(get_defined_constants(true, true));
+var_dump(gettype(get_defined_constants(true)));
+var_dump(gettype(get_defined_constants()));
+var_dump(count(get_defined_constants()));
+
+function test () {
+}
+
+var_dump(gettype(get_defined_functions()));
+var_dump(count(get_defined_functions()));
+
+var_dump(get_declared_interfaces(true));
+var_dump(gettype(get_declared_interfaces()));
+var_dump(count(get_declared_interfaces()));
+
+var_dump(get_extension_funcs());
+var_dump(get_extension_funcs(true));
+var_dump(gettype(get_extension_funcs("standard")));
+var_dump(count(get_extension_funcs("standard")));
+var_dump(gettype(get_extension_funcs("zend")));
+var_dump(count(get_extension_funcs("zend")));
+
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: get_resource_type() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+Warning: get_resource_type() expects parameter 1 to be resource, string given in %s on line %d
+NULL
+string(6) "stream"
+string(7) "Unknown"
+string(5) "array"
+int(%d)
+string(5) "array"
+int(%d)
+
+Warning: get_loaded_extensions() expects at most 1 parameter, 2 given in %s on line %d
+NULL
+
+Warning: get_defined_constants() expects at most 1 parameter, 2 given in %s on line %d
+NULL
+string(5) "array"
+string(5) "array"
+int(%d)
+string(5) "array"
+int(%d)
+
+Warning: get_declared_interfaces() expects exactly 0 parameters, 1 given in %s on line %d
+NULL
+string(5) "array"
+int(%d)
+
+Warning: get_extension_funcs() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+bool(false)
+string(5) "array"
+int(%d)
+string(5) "array"
+int(%d)
+Done

+ 34 - 0
EVSE/GPL/php-7.3.28/Zend/tests/018.phpt

@@ -0,0 +1,34 @@
+--TEST--
+constant() tests
+--FILE--
+<?php
+
+var_dump(constant());
+var_dump(constant("", ""));
+var_dump(constant(""));
+
+var_dump(constant(array()));
+
+define("TEST_CONST", 1);
+var_dump(constant("TEST_CONST"));
+
+define("TEST_CONST2", "test");
+var_dump(constant("TEST_CONST2"));
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: constant() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+Warning: constant() expects exactly 1 parameter, 2 given in %s on line %d
+NULL
+
+Warning: constant(): Couldn't find constant  in %s on line %d
+NULL
+
+Warning: constant() expects parameter 1 to be string, array given in %s on line %d
+NULL
+int(1)
+string(4) "test"
+Done

+ 1333 - 0
EVSE/GPL/php-7.3.28/Zend/tests/019.phpt

@@ -0,0 +1,1333 @@
+--TEST--
+Test unset(), empty() and isset() functions
+--FILE--
+<?php
+/* Prototype: void unset ( mixed $var [, mixed $var [, mixed $...]] );
+   Description: unset() destroys the specified variables
+
+   Prototype: bool empty( mixed $var );
+   Description: Determine whether a variable is considered to be empty
+
+   Prototype: bool isset ( mixed $var [, mixed $var [, $...]] );
+   Description: Returns TRUE if var exists; FALSE otherwise
+*/
+
+echo "*** Testing unset(), empty() & isset() with scalar variables ***\n";
+
+// testing scalar variables
+$scalar_variables = array(
+  0,
+  1,
+  +1
+  -1,
+  0x55,
+  -0xFA,
+  0123,
+  -0563,
+  0.0,
+  1e5,
+  1E-5,
+  -1.5e5,
+  +5.6,
+  "",
+  '',
+  " ",
+  ' ',
+  "string",
+  "123",
+  "0",
+  "ture",
+  "FALSE",
+  "NULL",
+  "null",
+  true,
+  false,
+  TRUE,
+  FALSE
+);
+
+$loop_counter = 1;
+foreach ($scalar_variables as $scalar_var) {
+  $set_var = 10; // this variable to use with isset
+  echo "-- Iteration $loop_counter --\n"; $loop_counter++;
+
+  // checking with isset before unsetting, expected: bool(true)
+  var_dump( isset($scalar_var) );
+  var_dump( isset($scalar_var, $set_var) );
+  // checking if the var is empty, expected: bool(false) on most
+  // except "", 0, "0", NULL, FALSE
+  var_dump( empty($scalar_var) );
+
+  // destroy the variable using unset
+  unset( $scalar_var );
+  // dump and see if its destroyed, expcted: NULL
+  var_dump( $scalar_var );
+
+  // check using isset to see if unset, expected: bool(false)
+  var_dump( isset($scalar_var) );
+  var_dump( isset($scalar_var, $set_var) );
+
+  // empty to check if empty, expecting bool(true)
+  var_dump( empty($scalar_var) );
+
+  // isset() with two args, one arg only unset, expected: bool(false)
+  var_dump( isset($scalar_var, $set_var) );
+
+  // isset() with two args, both args already unset, expected: bool(false);
+  unset($set_var);
+  var_dump( isset($scalar_var, $set_var) );
+}
+
+echo "\n*** Testing unset(), empty() & isset() with arrays ***\n";
+$array_variables = array(
+  array(),
+  array(NULL),
+  array(0),
+  array("0"),
+  array(""),
+  array(1,2,3,4),
+  array(1.4,2.5,5.6),
+  array(1 => "One", 2 => "two"),
+  array("Name" => "Jack", "Age" => "30"),
+  array(1,2, "One" => "1", 2 => "two", ""=>"empty", "" => '')
+);
+
+$outer_loop_counter = 1;
+foreach ($array_variables as $array_var) {
+  echo "--- Outerloop Iteration $outer_loop_counter ---\n";
+
+  // check the isset and unset on non existing key
+  $var = 1;  // a var which is defined
+  // try to unset the element which is non-existent
+  unset($array_var['non_existent']);
+  // check using isset() & empty() on a non_existent element in the array
+  var_dump( isset($array_var['non_existent']) );
+  var_dump( isset($array_var['non_existent'], $var) );
+  var_dump( isset($array_var['non_existent'], $array_var['none']) );
+  var_dump( empty($array_var['non_existent']) );
+
+  // testing empty and isset on arrays
+  var_dump( empty($array_var) ); // expecting bool(false), except: array(), which is considered empty
+  var_dump( isset($array_var) ); // expecting bool(true), except: array(), which is not set
+
+  // get the keys of the $array_var
+  $keys = array_keys($array_var);
+  // unset each element in the array and see the working of unset, isset & empty
+  $inner_loop_counter = 1;
+  foreach ($keys as $key_value) {
+    echo "-- Innerloop Iteration $inner_loop_counter of Outerloop Iteration $outer_loop_counter --\n";
+    $inner_loop_counter++;
+
+    // unset the element
+    unset($array_var[$key_value]);
+    // dump the array after element was unset
+    var_dump($array_var);
+    // check using isset for the element that was unset
+    var_dump( isset($array_var[$key_val]) ); // expected: bool(false)
+    // calling isset with more args
+    var_dump( isset($array_var[$key_val], $array_var) ); //expected: bool(false)
+
+    // calling empty, expected bool(true)
+    var_dump( empty($array_var[$key_val]) );
+
+    // dump the array to see that that array did not get modified
+    // because of using isset, empty and unset on its element
+    var_dump($array_var);
+  }
+
+  $outer_loop_counter++;
+
+  // unset the whole array
+  unset($array_var);
+  // dump the array to see its unset
+  var_dump($array_var);
+  // use isset to see that array is not set
+  var_dump( isset($array_var) ); //expected: bool(false)
+  var_dump( isset($array_var, $array_var[$key_val]) ); // expected: bool(false)
+
+  // empty() to see if the array is empty
+  var_dump( empty($array_var) ); // expected: bool(true)
+}
+
+echo "\n*** Testing unset(), emtpy() & isset() with resource variables ***\n";
+$fp = fopen(__FILE__, "r");
+$dfp = opendir( dirname(__FILE__) );
+$resources = array (
+  $fp,
+  $dfp
+);
+$loop_counter = 1;
+foreach ($resources as $resource) {
+  $temp_var = 10;
+  echo "-- Iteration $loop_counter --\n"; $loop_counter++;
+  //dump the resource first
+  var_dump($resource);
+
+  // check using isset() and empty()
+  var_dump( isset($resource) );  // expected: bool(true)
+  var_dump( empty($resource) );  // expected: bool(false)
+  // call isset() with two args, both set
+  var_dump( isset($resource, $temp_var) ); // expected: bool(true)
+
+  // dump the resource to see using isset() and empty () had no effect on it
+  var_dump($resource);
+
+  // unset the resource
+  unset($resource);
+  // check using isset() and empty()
+  var_dump( isset($resource) );  // expected: bool(flase)
+  var_dump( empty($resource) );  // expected: bool(true)
+  // call isset() with two args, but one set
+  var_dump( isset($resource, $temp_var) ); // expected: bool(false)
+  // uset the temp_var
+  unset($temp_var);
+  // now the isset() with both the args as unset
+  var_dump( isset($resource, $temp_var) ); // expected: bool(false);
+
+  // dump the resource to see if there any effect on it
+  var_dump($resource);
+}
+// unset and dump the array containing all the resources to see that
+// unset works correctly
+unset($resources);
+var_dump($resources);
+var_dump( isset($resources) );  //expected: bool(false)
+var_dump( empty($resources) );  // expected: bool(true)
+
+echo "\n*** Testing unset(), empty() & isset() with objects ***\n";
+class Point
+{
+  var $x;
+  var $y;
+  var $lable;
+
+  function __construct($x, $y) {
+    $this->x = $x;
+    $this->y = $y;
+  }
+
+  function setLable($lable) {
+    $this->lable = $lable;
+  }
+  function testPoint() {
+    echo "\nPoint::testPoint() called\n";
+  }
+}
+$point1 = new Point(30,40);
+
+// use unset/empty/isset to check the object
+var_dump($point1); // dump the object
+
+// check the object and member that is not set
+var_dump( isset($point1) );  // expected: bool(true)
+var_dump( empty($point1) );  // expected: bool(false)
+var_dump( isset($point1->$lable) );  //expected: bool(flase)
+var_dump( empty($point1->$lable) );  //expected: bool(true)
+
+//set the member variable lable and check
+$point1->setLable("Point1");
+var_dump( isset($point1->$lable) );  //expected: bool(true)
+var_dump( empty($point1->$lable) );  //expected: bool(false)
+
+// dump the object to see that obj was not harmed
+// because of the usage of the isset & empty
+var_dump($point1);
+
+//unset a member and check
+unset($point1->x);
+// dump the point to see that variable was unset
+var_dump($point1);
+var_dump( isset($point1->x) );  // expected: bool(false)
+var_dump( empty($point1->x) );  // expected: bool(true)
+
+// unset all members and check
+unset($point1->y);
+unset($point1->lable);
+// dump the objec to check that all variables are unset
+var_dump($point1);
+var_dump( isset($point1) );  // expected: bool(ture)
+var_dump( empty($point1) );  // expected: bool(false)
+
+//unset the object and check
+unset($point1);
+var_dump( isset($point1) );  // expected: bool(false)
+var_dump( empty($point1) );  // expected: bool(true)
+// dump to see that object is unset
+var_dump($point1);
+
+// try isset/unset/empty on a member function
+$point2 = new Point(5,6);
+var_dump( isset($point2->testPoint) );
+var_dump( empty($point2->testPoint) );
+unset($point2->testPoint);
+var_dump( isset($point2->testPoint) );
+var_dump( empty($point2->testPoint) );
+
+// use get_class_methods to see effect if any
+var_dump( get_class_methods($point2) );
+// dump the object to see the effect, none expected
+var_dump($point2);
+
+/* testing variation in operation for isset(), empty() & unset().
+Note: Most of the variation for function unset() is testing by a
+      set of testcases named "Zend/tests/unset_cv??.phpt", only
+      variation not tested are attempted here */
+
+echo "\n*** Testing possible variation in operation for isset(), empty() & unset() ***\n";
+/* unset() variation1: checking unset on static variable inside a function.
+ * unset() destroys the variable only in the context of the rest of a function
+ * Following calls will restore the previous value of a variable.
+ */
+echo "\n** Testing unset() variation 1: unset on static variable inside a function **\n";
+function test_unset1() {
+  static $static_var;
+
+  // increment the value of the static. this change is in function context
+  $static_var ++;
+
+  echo "value of static_var before unset: $static_var\n";
+  // check using isset and empty
+  var_dump( isset($static_var) );
+  var_dump( empty($static_var) );
+
+  // unset the static var
+  unset($static_var);
+  echo "value of static_var after unset: $static_var\n";
+  // check using isset and empty
+  var_dump( isset($static_var) );
+  var_dump( empty($static_var) );
+
+  // assign a value to static var
+  $static_var = 20;
+  echo "value of static_var after new assignment: $static_var\n";
+}
+// call the functiont
+test_unset1();
+test_unset1();
+test_unset1();
+
+
+echo "\n** Testing unset() variation 2: unset on a variable passed by ref. inside of a function **\n";
+/* unset() variation2: Pass by reference
+ * If a variable that is PASSED BY REFERENCE is unset() inside of a function,
+ * only the local variable is destroyed. The variable in the calling environment
+ * will retain the same value as before unset()  was called.
+ */
+function test_unset2( &$ref_val ) {
+  // unset the variable passed
+  unset($ref_val);
+  // check using isset and empty to confirm
+  var_dump( isset($ref_val) );
+  var_dump( empty($ref_val) );
+
+  // set the value ot a new one
+  $ref_val = "new value by ref";
+}
+
+$value = "value";
+var_dump($value);
+test_unset2($value);
+var_dump($value);
+
+
+echo "\n** Testing unset() variation 3: unset on a global variable inside of a function **\n";
+/* unset() variation2: unset on a global variable inside a function
+ * If a globalized variable is unset() inside of a function, only the
+ * local variable is destroyed. The variable in the calling environment
+ * will retain the same value as before unset() was called.
+ */
+$global_var = 10;
+
+function test_unset3() {
+  global $global_var;
+
+  // check the $global_var using isset and empty
+  var_dump( isset($global_var) );
+  var_dump( empty($global_var) );
+
+  // unset the global var
+  unset($global_var);
+
+  // check the $global_var using isset and empty
+  var_dump( isset($global_var) );
+  var_dump( empty($global_var) );
+}
+
+var_dump($global_var);
+test_unset3();
+var_dump($global_var);
+
+//Note: No error conditions relating to passing arguments can be tested
+// because these are not functions but statements, it will result in syntax error.
+?>
+===DONE===
+--EXPECTF--
+*** Testing unset(), empty() & isset() with scalar variables ***
+-- Iteration 1 --
+bool(true)
+bool(true)
+bool(true)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 2 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 3 --
+bool(true)
+bool(true)
+bool(true)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 4 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 5 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 6 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 7 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 8 --
+bool(true)
+bool(true)
+bool(true)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 9 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 10 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 11 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 12 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 13 --
+bool(true)
+bool(true)
+bool(true)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 14 --
+bool(true)
+bool(true)
+bool(true)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 15 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 16 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 17 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 18 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 19 --
+bool(true)
+bool(true)
+bool(true)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 20 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 21 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 22 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 23 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 24 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 25 --
+bool(true)
+bool(true)
+bool(true)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 26 --
+bool(true)
+bool(true)
+bool(false)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+-- Iteration 27 --
+bool(true)
+bool(true)
+bool(true)
+
+Notice: Undefined variable: scalar_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+
+*** Testing unset(), empty() & isset() with arrays ***
+--- Outerloop Iteration 1 ---
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(true)
+bool(true)
+
+Notice: Undefined variable: array_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+--- Outerloop Iteration 2 ---
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+-- Innerloop Iteration 1 of Outerloop Iteration 2 --
+array(0) {
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(0) {
+}
+
+Notice: Undefined variable: array_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+--- Outerloop Iteration 3 ---
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+-- Innerloop Iteration 1 of Outerloop Iteration 3 --
+array(0) {
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(0) {
+}
+
+Notice: Undefined variable: array_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+--- Outerloop Iteration 4 ---
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+-- Innerloop Iteration 1 of Outerloop Iteration 4 --
+array(0) {
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(0) {
+}
+
+Notice: Undefined variable: array_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+--- Outerloop Iteration 5 ---
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+-- Innerloop Iteration 1 of Outerloop Iteration 5 --
+array(0) {
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(0) {
+}
+
+Notice: Undefined variable: array_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+--- Outerloop Iteration 6 ---
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+-- Innerloop Iteration 1 of Outerloop Iteration 6 --
+array(3) {
+  [1]=>
+  int(2)
+  [2]=>
+  int(3)
+  [3]=>
+  int(4)
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(3) {
+  [1]=>
+  int(2)
+  [2]=>
+  int(3)
+  [3]=>
+  int(4)
+}
+-- Innerloop Iteration 2 of Outerloop Iteration 6 --
+array(2) {
+  [2]=>
+  int(3)
+  [3]=>
+  int(4)
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(2) {
+  [2]=>
+  int(3)
+  [3]=>
+  int(4)
+}
+-- Innerloop Iteration 3 of Outerloop Iteration 6 --
+array(1) {
+  [3]=>
+  int(4)
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(1) {
+  [3]=>
+  int(4)
+}
+-- Innerloop Iteration 4 of Outerloop Iteration 6 --
+array(0) {
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(0) {
+}
+
+Notice: Undefined variable: array_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+--- Outerloop Iteration 7 ---
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+-- Innerloop Iteration 1 of Outerloop Iteration 7 --
+array(2) {
+  [1]=>
+  float(2.5)
+  [2]=>
+  float(5.6)
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(2) {
+  [1]=>
+  float(2.5)
+  [2]=>
+  float(5.6)
+}
+-- Innerloop Iteration 2 of Outerloop Iteration 7 --
+array(1) {
+  [2]=>
+  float(5.6)
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(1) {
+  [2]=>
+  float(5.6)
+}
+-- Innerloop Iteration 3 of Outerloop Iteration 7 --
+array(0) {
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(0) {
+}
+
+Notice: Undefined variable: array_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+--- Outerloop Iteration 8 ---
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+-- Innerloop Iteration 1 of Outerloop Iteration 8 --
+array(1) {
+  [2]=>
+  string(3) "two"
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(1) {
+  [2]=>
+  string(3) "two"
+}
+-- Innerloop Iteration 2 of Outerloop Iteration 8 --
+array(0) {
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(0) {
+}
+
+Notice: Undefined variable: array_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+--- Outerloop Iteration 9 ---
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+-- Innerloop Iteration 1 of Outerloop Iteration 9 --
+array(1) {
+  ["Age"]=>
+  string(2) "30"
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(1) {
+  ["Age"]=>
+  string(2) "30"
+}
+-- Innerloop Iteration 2 of Outerloop Iteration 9 --
+array(0) {
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(0) {
+}
+
+Notice: Undefined variable: array_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+--- Outerloop Iteration 10 ---
+bool(false)
+bool(false)
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+-- Innerloop Iteration 1 of Outerloop Iteration 10 --
+array(4) {
+  [1]=>
+  int(2)
+  ["One"]=>
+  string(1) "1"
+  [2]=>
+  string(3) "two"
+  [""]=>
+  string(0) ""
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(4) {
+  [1]=>
+  int(2)
+  ["One"]=>
+  string(1) "1"
+  [2]=>
+  string(3) "two"
+  [""]=>
+  string(0) ""
+}
+-- Innerloop Iteration 2 of Outerloop Iteration 10 --
+array(3) {
+  ["One"]=>
+  string(1) "1"
+  [2]=>
+  string(3) "two"
+  [""]=>
+  string(0) ""
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(3) {
+  ["One"]=>
+  string(1) "1"
+  [2]=>
+  string(3) "two"
+  [""]=>
+  string(0) ""
+}
+-- Innerloop Iteration 3 of Outerloop Iteration 10 --
+array(2) {
+  [2]=>
+  string(3) "two"
+  [""]=>
+  string(0) ""
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(2) {
+  [2]=>
+  string(3) "two"
+  [""]=>
+  string(0) ""
+}
+-- Innerloop Iteration 4 of Outerloop Iteration 10 --
+array(1) {
+  [""]=>
+  string(0) ""
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(1) {
+  [""]=>
+  string(0) ""
+}
+-- Innerloop Iteration 5 of Outerloop Iteration 10 --
+array(0) {
+}
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(false)
+
+Notice: Undefined variable: key_val in %s on line %d
+bool(true)
+array(0) {
+}
+
+Notice: Undefined variable: array_var in %s on line %d
+NULL
+bool(false)
+bool(false)
+bool(true)
+
+*** Testing unset(), emtpy() & isset() with resource variables ***
+-- Iteration 1 --
+resource(%d) of type (stream)
+bool(true)
+bool(false)
+bool(true)
+resource(%d) of type (stream)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+
+Notice: Undefined variable: resource in %s on line %d
+NULL
+-- Iteration 2 --
+resource(%d) of type (stream)
+bool(true)
+bool(false)
+bool(true)
+resource(%d) of type (stream)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
+
+Notice: Undefined variable: resource in %s on line %d
+NULL
+
+Notice: Undefined variable: resources in %s on line %d
+NULL
+bool(false)
+bool(true)
+
+*** Testing unset(), empty() & isset() with objects ***
+object(Point)#%d (3) {
+  ["x"]=>
+  int(30)
+  ["y"]=>
+  int(40)
+  ["lable"]=>
+  NULL
+}
+bool(true)
+bool(false)
+
+Notice: Undefined variable: lable in %s on line %d
+bool(false)
+
+Notice: Undefined variable: lable in %s on line %d
+bool(true)
+
+Notice: Undefined variable: lable in %s on line %d
+bool(false)
+
+Notice: Undefined variable: lable in %s on line %d
+bool(true)
+object(Point)#%d (3) {
+  ["x"]=>
+  int(30)
+  ["y"]=>
+  int(40)
+  ["lable"]=>
+  string(6) "Point1"
+}
+object(Point)#%d (2) {
+  ["y"]=>
+  int(40)
+  ["lable"]=>
+  string(6) "Point1"
+}
+bool(false)
+bool(true)
+object(Point)#%d (0) {
+}
+bool(true)
+bool(false)
+bool(false)
+bool(true)
+
+Notice: Undefined variable: point1 in %s on line %d
+NULL
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+array(3) {
+  [0]=>
+  string(11) "__construct"
+  [1]=>
+  string(8) "setLable"
+  [2]=>
+  string(9) "testPoint"
+}
+object(Point)#%d (3) {
+  ["x"]=>
+  int(5)
+  ["y"]=>
+  int(6)
+  ["lable"]=>
+  NULL
+}
+
+*** Testing possible variation in operation for isset(), empty() & unset() ***
+
+** Testing unset() variation 1: unset on static variable inside a function **
+value of static_var before unset: 1
+bool(true)
+bool(false)
+
+Notice: Undefined variable: static_var in %s on line %d
+value of static_var after unset: 
+bool(false)
+bool(true)
+value of static_var after new assignment: 20
+value of static_var before unset: 2
+bool(true)
+bool(false)
+
+Notice: Undefined variable: static_var in %s on line %d
+value of static_var after unset: 
+bool(false)
+bool(true)
+value of static_var after new assignment: 20
+value of static_var before unset: 3
+bool(true)
+bool(false)
+
+Notice: Undefined variable: static_var in %s on line %d
+value of static_var after unset: 
+bool(false)
+bool(true)
+value of static_var after new assignment: 20
+
+** Testing unset() variation 2: unset on a variable passed by ref. inside of a function **
+string(5) "value"
+bool(false)
+bool(true)
+string(5) "value"
+
+** Testing unset() variation 3: unset on a global variable inside of a function **
+int(10)
+bool(true)
+bool(false)
+bool(false)
+bool(true)
+int(10)
+===DONE===

+ 34 - 0
EVSE/GPL/php-7.3.28/Zend/tests/020.phpt

@@ -0,0 +1,34 @@
+--TEST--
+func_get_arg() invalid usage
+--FILE--
+<?php
+
+var_dump(func_get_arg(1,2,3));
+var_dump(func_get_arg(1));
+var_dump(func_get_arg());
+
+function bar() {
+	var_dump(func_get_arg(1));
+}
+
+function foo() {
+	bar(func_get_arg(1));
+}
+
+foo(1,2);
+
+echo "Done\n";
+?>
+--EXPECTF--
+Warning: func_get_arg() expects exactly 1 parameter, 3 given in %s on line %d
+NULL
+
+Warning: func_get_arg():  Called from the global scope - no function context in %s on line %d
+bool(false)
+
+Warning: func_get_arg() expects exactly 1 parameter, 0 given in %s on line %d
+NULL
+
+Warning: func_get_arg():  Argument 1 not passed to function in %s on line %d
+bool(false)
+Done

+ 37 - 0
EVSE/GPL/php-7.3.28/Zend/tests/021.phpt

@@ -0,0 +1,37 @@
+--TEST--
+?: operator
+--FILE--
+<?php
+var_dump(true ?: false);
+var_dump(false ?: true);
+var_dump(23 ?: 42);
+var_dump(0 ?: "bar");
+
+$a = 23;
+$b = 0;
+$c = "";
+$d = 23.5;
+
+var_dump($a ?: $b);
+var_dump($c ?: $d);
+
+var_dump(1 ?: print(2));
+
+$e = array();
+
+$e['e'] = 'e';
+$e['e'] = $e['e'] ?: 'e';
+print_r($e);
+?>
+--EXPECT--
+bool(true)
+bool(true)
+int(23)
+string(3) "bar"
+int(23)
+float(23.5)
+int(1)
+Array
+(
+    [e] => e
+)

+ 24 - 0
EVSE/GPL/php-7.3.28/Zend/tests/022.phpt

@@ -0,0 +1,24 @@
+--TEST--
+Implementating abstracting methods and optional parameters
+--FILE--
+<?php
+
+abstract class Base
+{
+	abstract function someMethod($param);
+}
+
+class Ext extends Base
+{
+	function someMethod($param = "default")
+	{
+		echo $param, "\n";
+	}
+}
+
+$a = new Ext();
+$a->someMethod("foo");
+$a->someMethod();
+--EXPECT--
+foo
+default

+ 45 - 0
EVSE/GPL/php-7.3.28/Zend/tests/023.phpt

@@ -0,0 +1,45 @@
+--TEST--
+Testing variable variables as function name
+--FILE--
+<?php
+
+$a = 'ucfirst';
+$b = 'a';
+print $$b('test');
+print "\n";
+
+
+class bar {
+	public function a() {
+		return "bar!";
+	}
+}
+
+class foo {
+	public function test() {
+		print "foo!\n";
+		return new bar;
+	}
+}
+
+function test() {
+	return new foo;
+}
+
+$a = 'test';
+$b = 'a';
+var_dump($$b()->$$b()->$b());
+
+
+$a = 'strtoupper';
+$b = 'a';
+$c = 'b';
+$d = 'c';
+var_dump($$$$d('foo'));
+
+?>
+--EXPECT--
+Test
+foo!
+string(4) "bar!"
+string(3) "FOO"

+ 51 - 0
EVSE/GPL/php-7.3.28/Zend/tests/024.phpt

@@ -0,0 +1,51 @@
+--TEST--
+Testing operations with undefined variable
+--FILE--
+<?php
+
+var_dump($a[1]);
+var_dump($a[$c]);
+var_dump($a + 1);
+var_dump($a + $b);
+var_dump($a++);
+var_dump(++$b);
+var_dump($a->$b);
+var_dump($a->$b);
+var_dump($a->$b->{$c[1]});
+
+?>
+--EXPECTF--
+Notice: Undefined variable: a in %s on line %d
+NULL
+
+Notice: Undefined variable: %s in %s on line %d
+
+Notice: Undefined variable: %s in %s on line %d
+NULL
+
+Notice: Undefined variable: a in %s on line %d
+int(1)
+
+Notice: Undefined variable: %s in %s on line %d
+
+Notice: Undefined variable: %s in %s on line %d
+int(0)
+
+Notice: Undefined variable: a in %s on line %d
+NULL
+
+Notice: Undefined variable: b in %s on line %d
+int(1)
+
+Notice: Trying to get property '1' of non-object in %s on line %d
+NULL
+
+Notice: Trying to get property '1' of non-object in %s on line %d
+NULL
+
+Notice: Undefined variable: c in %s on line %d
+
+Notice: Trying to get property '1' of non-object in %s on line %d
+
+Notice: Trying to get property '' of non-object in %s on line %d
+NULL

+ 32 - 0
EVSE/GPL/php-7.3.28/Zend/tests/025.phpt

@@ -0,0 +1,32 @@
+--TEST--
+Testing dynamic calls
+--FILE--
+<?php
+
+class foo {
+	static public function a() {
+		print "ok\n";
+	}
+}
+
+$a = 'a';
+$b = 'a';
+
+$class = 'foo';
+
+foo::a();
+foo::$a();
+foo::$$b();
+
+$class::a();
+$class::$a();
+$class::$$b();
+
+?>
+--EXPECT--
+ok
+ok
+ok
+ok
+ok
+ok

+ 25 - 0
EVSE/GPL/php-7.3.28/Zend/tests/026.phpt

@@ -0,0 +1,25 @@
+--TEST--
+Trying assign value to property when an object is not returned in a function
+--FILE--
+<?php
+
+class foo {
+	public function a() {
+	}
+}
+
+$test = new foo;
+
+$test->a()->a;
+print "ok\n";
+
+$test->a()->a = 1;
+print "ok\n";
+
+?>
+--EXPECTF--
+Notice: Trying to get property 'a' of non-object in %s on line %d
+ok
+
+Warning: Creating default object from empty value in %s on line %d
+ok

+ 22 - 0
EVSE/GPL/php-7.3.28/Zend/tests/027.phpt

@@ -0,0 +1,22 @@
+--TEST--
+Testing dynamic calls using variable variables with curly syntax
+--FILE--
+<?php
+
+$a = 'b';
+$b = 'c';
+$c = 'strtoupper';
+
+var_dump(${${$a}}('foo') == 'FOO');
+
+$a = 'b';
+$b = 'c';
+$c = 'strtoupper';
+$strtoupper = 'strtolower';
+
+var_dump(${${++$a}}('FOO') == 'foo');
+
+?>
+--EXPECT--
+bool(true)
+bool(true)

+ 26 - 0
EVSE/GPL/php-7.3.28/Zend/tests/028.phpt

@@ -0,0 +1,26 @@
+--TEST--
+Testing function call through of array item
+--FILE--
+<?php
+
+$arr = array('strtoupper', 'strtolower');
+
+$k = 0;
+
+var_dump($arr[0]('foo') == 'FOO');
+var_dump($arr[$k]('foo') == 'FOO');
+var_dump($arr[++$k]('FOO') == 'foo');
+var_dump($arr[++$k]('FOO') == 'foo');
+
+?>
+--EXPECTF--
+bool(true)
+bool(true)
+bool(true)
+
+Notice: Undefined offset: 2 in %s on line %d
+
+Fatal error: Uncaught Error: Function name must be a string in %s:%d
+Stack trace:
+#0 {main}
+  thrown in %s on line %d

+ 51 - 0
EVSE/GPL/php-7.3.28/Zend/tests/029.phpt

@@ -0,0 +1,51 @@
+--TEST--
+Testing assign to property of an object in an array
+--FILE--
+<?php
+
+$arr = array(new stdClass);
+
+$arr[0]->a = clone $arr[0];
+var_dump($arr);
+
+$arr[0]->b = new $arr[0];
+var_dump($arr);
+
+$arr[0]->c = $arr[0]->a;
+var_dump($arr);
+
+?>
+--EXPECT--
+array(1) {
+  [0]=>
+  object(stdClass)#1 (1) {
+    ["a"]=>
+    object(stdClass)#2 (0) {
+    }
+  }
+}
+array(1) {
+  [0]=>
+  object(stdClass)#1 (2) {
+    ["a"]=>
+    object(stdClass)#2 (0) {
+    }
+    ["b"]=>
+    object(stdClass)#3 (0) {
+    }
+  }
+}
+array(1) {
+  [0]=>
+  object(stdClass)#1 (3) {
+    ["a"]=>
+    object(stdClass)#2 (0) {
+    }
+    ["b"]=>
+    object(stdClass)#3 (0) {
+    }
+    ["c"]=>
+    object(stdClass)#2 (0) {
+    }
+  }
+}

+ 34 - 0
EVSE/GPL/php-7.3.28/Zend/tests/030.phpt

@@ -0,0 +1,34 @@
+--TEST--
+Overriding $this in catch and checking the object properties later.
+--FILE--
+<?php
+
+class foo {
+	public $test = 0;
+	private $test_2 = 1;
+	protected $test_3 = 2;
+
+	public function bar() {
+		try {
+			throw new Exception('foo');
+		} catch (Exception $this) {
+			var_dump($this);
+		}
+
+		$this->baz();
+	}
+
+	public function baz() {
+		foreach ($this as $k => $v) {
+			printf("'%s' => '%s'\n", $k, $v);
+		}
+		print "ok\n";
+	}
+}
+
+$test = new foo;
+$test->bar();
+
+?>
+--EXPECTF--
+Fatal error: Cannot re-assign $this in %s030.php on line 11

+ 11 - 0
EVSE/GPL/php-7.3.28/Zend/tests/031.phpt

@@ -0,0 +1,11 @@
+--TEST--
+Testing array with '[]' passed as argument by value
+--FILE--
+<?php
+
+function test($var) { }
+test($arr[]);
+
+?>
+--EXPECTF--
+Fatal error: Cannot use [] for reading in %s on line %d

+ 13 - 0
EVSE/GPL/php-7.3.28/Zend/tests/032.phpt

@@ -0,0 +1,13 @@
+--TEST--
+Testing array with '[]' passed as argument by reference
+--FILE--
+<?php
+
+function test(&$var) { }
+test($arr[]);
+
+print "ok!\n";
+
+?>
+--EXPECT--
+ok!

+ 30 - 0
EVSE/GPL/php-7.3.28/Zend/tests/033.phpt

@@ -0,0 +1,30 @@
+--TEST--
+Using undefined multidimensional array
+--FILE--
+<?php
+
+$arr[1][2][3][4][5];
+
+echo $arr[1][2][3][4][5];
+
+$arr[1][2][3][4][5]->foo;
+
+$arr[1][2][3][4][5]->foo = 1;
+
+$arr[][] = 2;
+
+$arr[][]->bar = 2;
+
+?>
+--EXPECTF--
+Notice: Undefined variable: arr in %s on line %d
+
+Notice: Undefined variable: arr in %s on line %d
+
+Notice: Undefined variable: arr in %s on line %d
+
+Notice: Trying to get property 'foo' of non-object in %s on line %d
+
+Warning: Creating default object from empty value in %s on line %d
+
+Warning: Creating default object from empty value in %s on line %d

+ 26 - 0
EVSE/GPL/php-7.3.28/Zend/tests/034.phpt

@@ -0,0 +1,26 @@
+--TEST--
+Testing multiples 'default:' in switch
+--FILE--
+<?php
+
+switch (1) {
+	case 2:
+		print 'foo';
+		break;
+	case 3:
+		print 'bar';
+		break;
+	default:
+		print 1;
+		break;
+	default:
+		print 2;
+		break;
+	default:
+		print 3;
+		break;
+}
+
+?>
+--EXPECTF--
+Fatal error: Switch statements may only contain one default clause in %s on line 13

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio