要在顶层目录执行auto/configure
执行完后生成了Makefile和objs目录,objs目录里有src的目录层次以及
autoconf.err,Makefile,ngx_auto_config.h,ngx_auto_headers.h,ngx_modules.c
目录里都是空的
configure就是一个shell脚本,开头引入3个脚本
auto/options
shell新用法,把下面的循环写在脚本里,运行脚本,脚本的参数可以一一提取
for h
do
echo $h
done
options就是设置各种配置项,开关等,选项保存在NGX_CONFIGURE中,如果有help选项,输出帮助信息,然后退出。
默认支持HTTP,
NGX_SBIN_PATH=sbin/nginx,
NGX_MODULES_PATH=modules
NGX_CONF_PATH=conf/nginx.conf
NGX_CONF_PREFIX=dirname $NGX_CONF_PATH=conf
NGX_PID_PATH=logs/nginx.pid
NGX_LOCK_PATH=logs/nginx.lock
NGX_ERROR_LOG_PATH=logs/error.log
NGX_HTTP_LOG_PATH=logs/access.log
NGX_HTTP_CLIENT_TEMP_PATH=client_body_temp
NGX_HTTP_PROXY_TEMP_PATH=proxy_temp
NGX_HTTP_FASTCGI_TEMP_PATH=fastcgi_temp
NGX_HTTP_UWSGI_TEMP_PATH=uwsgi_temp
NGX_HTTP_SCGI_TEMP_PATH=scgi_temp
特殊处理了NGX_PERL_MODULES
auto/init
在options脚本中定义了NGX_OBJS=objs
NGX_MAKEFILE=objs/Makefile
NGX_MODULES_C=$NGX_OBJS/ngx_modules.c
NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h
NGX_AUTO_CONFIG_H=$NGX_OBJS/ngx_auto_config.h
NGX_AUTOTEST=$NGX_OBJS/autotest
NGX_AUTOCONF_ERR=$NGX_OBJS/autoconf.err
NGX_ERR=$NGX_OBJS/autoconf.err
MAKEFILE=$NGX_OBJS/Makefile
生成Makefile,没有用变量
default: build
clean:
rm -rf Makefile $NGX_OBJS
auto/sources
定义要编译的文件
CORE_MODULES="ngx_core_module ngx_errlog_module ngx_conf_module"
CORE_INCS="src/core"
CORE_DEPS="src/core/nginx.h \
...
CORE_SRCS="src/core/nginx.c \
...
EVENT_MODULES="ngx_events_module ngx_event_core_module"
EVENT_INCS="src/event src/event/modules"
EVENT_DEPS="src/event/ngx_event.h \
...
EVENT_SRCS="src/event/ngx_event.c \
...
SELECT_MODULE=ngx_select_module
SELECT_SRCS=src/event/modules/ngx_select_module.c
WIN32_SELECT_SRCS=src/event/modules/ngx_win32_select_module.c
POLL_MODULE=ngx_poll_module
POLL_SRCS=src/event/modules/ngx_poll_module.c
KQUEUE_MODULE=ngx_kqueue_module
KQUEUE_SRCS=src/event/modules/ngx_kqueue_module.c
DEVPOLL_MODULE=ngx_devpoll_module
DEVPOLL_SRCS=src/event/modules/ngx_devpoll_module.c
EVENTPORT_MODULE=ngx_eventport_module
EVENTPORT_SRCS=src/event/modules/ngx_eventport_module.c
EPOLL_MODULE=ngx_epoll_module
EPOLL_SRCS=src/event/modules/ngx_epoll_module.c
IOCP_MODULE=ngx_iocp_module
IOCP_SRCS=src/event/modules/ngx_iocp_module.c
FILE_AIO_SRCS="src/os/unix/ngx_file_aio_read.c"
LINUX_AIO_SRCS="src/os/unix/ngx_linux_aio_read.c"
UNIX_INCS="$CORE_INCS $EVENT_INCS src/os/unix"
UNIX_DEPS="$CORE_DEPS $EVENT_DEPS \
...
UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \
src/os/unix/ngx_time.c \
...
POSIX_DEPS=src/os/unix/ngx_posix_config.h
THREAD_POOL_MODULE=ngx_thread_pool_module
THREAD_POOL_DEPS=src/core/ngx_thread_pool.h
THREAD_POOL_SRCS="src/core/ngx_thread_pool.c
...
FREEBSD_DEPS/FREEBSD_SRCS/FREEBSD_SENDFILE_SRCS
LINUX_DEPS/LINUX_SRCS/LINUX_SENDFILE_SRCS
...
WIN32_INCS/WIN32_DEPS/WIN32_CONFIG/WIN32_SRCS/NGX_WIN32_ICONS/NGX_WIN32_RC
HTTP_FILE_CACHE_SRCS=src/http/ngx_http_file_cache.c
configure的工作
如果NGX_OBJS目录不存在,创建
在ngx_auto_headers.h文件中定义NGX_CONFIGURE宏,为option脚本中的NGX_CONFIGURE变量的值,形如"--xx --yy"
如果option指定了NGX_DEBUG,包含auto/have,在ngx_auto_headers.h文件中定义NGX_DEBUG为1
检查操作系统,uname -s,uname -r,uname -m
NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE";Linux:3.19.0-25-generic:x86_64
包含auto/cc/conf,
先调用auto/cc/name,检查$CC变量。
NGX_CC_NAME=gcc
再调用auto/cc/gcc,获取版本,have=NGX_COMPILER value="\"gcc $NGX_GCC_VER\"" . auto/define调用,定义宏NGX_COMPILER
ngx_feature="gcc -pipe switch"
调用auto/feature,生成代码,编译,不运行,打印found
再检查-Wl,-E switch,
再检查gcc builtin atomic operations
C99 variadic macros
gcc variadic macros
gcc builtin 64 bit byteswap(在生成的代码里加)
调用auto/headers
再调auto/include,包含此头文件,生成代码,编译
调用auto/os/conf
调用auto/os/linux
调用auto/feature,检查epoll,O_PATH,sendfile,prctl,sched_setaffinity,crypt_r,sys/vfs.h头文件是否存在
定义宏NGX_HAVE_NONALIGNED,NGX_CPU_CACHE_LINE = 64
调用auto/unix
NGX_USER=nobody,NGX_GROUP=nogroup
检查poll()函数,
检查/dev/poll,如果有,CORE_SRCS加上DEVPOLL_SRCS,EVENT_MODULES加上DEVPOLL_MODULE
检查kqueue's NOTE_LOWAT
...
检查int的长度,写代码,计算sizeof
...
mmap
...
调用auto/threads
定义NGX_THREADS,CORE_DEPS,CORE_SRCS,CORE_LIBS加上threads相关
调用auto/modules
加上EVENT_MODULES
http module
要编译的源代码都存在NGX_ADDON_SRCS变量
...
modules="$CORE_MODULES $EVENT_MODULES"
...
所有的module的会在objs/ngx_modules.c中申明
ngx_module_names,ngx_module_t *ngx_modules[]
调用auto/lib/conf
check各种库,pcre,libz等
调用auto/make
创建编译目录,生成obj/Makefile
调用auto/lib/make
为库生成makefile
调用auto/install
继续在obj/Makefile中生成install目标
调用auto/stubs
定义宏
调用auto/summary
打印某些变量的值
+ Linux 3.19.0-25-generic x86_64
checking for C compiler ... found
+ using GNU C compiler
+ gcc version: 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.1)
checking for gcc -pipe switch ... found
checking for -Wl,-E switch ... found
checking for gcc builtin atomic operations ... found
checking for C99 variadic macros ... found
checking for gcc variadic macros ... found
checking for gcc builtin 64 bit byteswap ... found
checking for unistd.h ... found
checking for inttypes.h ... found
checking for limits.h ... found
checking for sys/filio.h ... not found
checking for sys/param.h ... found
checking for sys/mount.h ... found
checking for sys/statvfs.h ... found
checking for crypt.h ... found
checking for Linux specific features
checking for epoll ... found
checking for EPOLLRDHUP ... found
checking for EPOLLEXCLUSIVE ... not found
checking for O_PATH ... found
checking for sendfile() ... found
checking for sendfile64() ... found
checking for sys/prctl.h ... found
checking for prctl(PR_SET_DUMPABLE) ... found
checking for sched_setaffinity() ... found
checking for crypt_r() ... found
checking for sys/vfs.h ... found
checking for nobody group ... not found
checking for nogroup group ... found
checking for poll() ... found
checking for /dev/poll ... not found
checking for kqueue ... not found
checking for crypt() ... not found
checking for crypt() in libcrypt ... found
checking for F_READAHEAD ... not found
checking for posix_fadvise() ... found
checking for O_DIRECT ... found
checking for F_NOCACHE ... not found
checking for directio() ... not found
checking for statfs() ... found
checking for statvfs() ... found
checking for dlopen() ... not found
checking for dlopen() in libdl ... found
checking for sched_yield() ... found
checking for SO_SETFIB ... not found
checking for SO_REUSEPORT ... found
checking for SO_ACCEPTFILTER ... not found
checking for SO_BINDANY ... not found
checking for IP_BIND_ADDRESS_NO_PORT ... not found
checking for IP_TRANSPARENT ... found
checking for IP_BINDANY ...^C not found
checking for IP_RECVDSTADDR ... not found
checking for IP_PKTINFO ... found
checking for IPV6_RECVPKTINFO ... found
checking for TCP_DEFER_ACCEPT ... found
checking for TCP_KEEPIDLE ... found
checking for TCP_FASTOPEN ... found
checking for TCP_INFO ... found
checking for accept4() ... found
checking for eventfd() ... found
checking for int size ... 4 bytes
checking for long size ... 8 bytes
checking for long long size ... 8 bytes
checking for void * size ... 8 bytes
checking for uint32_t ... found
checking for uint64_t ... found
checking for sig_atomic_t ... found
checking for sig_atomic_t size ... 4 bytes
checking for socklen_t ... found
checking for in_addr_t ... found
checking for in_port_t ... found
checking for rlim_t ... found
checking for uintptr_t ... uintptr_t found
checking for system byte ordering ... little endian
checking for size_t size ... 8 bytes
checking for off_t size ... 8 bytes
checking for time_t size ... 8 bytes
checking for AF_INET6 ... found
checking for setproctitle() ... not found
checking for pread() ... found
checking for pwrite() ... found
checking for pwritev() ... found
checking for sys_nerr ... found
checking for localtime_r() ... found
checking for posix_memalign() ... found
checking for memalign() ... found
checking for mmap(MAP_ANON|MAP_SHARED) ... found
checking for mmap("/dev/zero", MAP_SHARED) ... found
checking for System V shared memory ... found
checking for POSIX semaphores ... not found
checking for POSIX semaphores in libpthread ... found
checking for struct msghdr.msg_control ... found
checking for ioctl(FIONBIO) ... found
checking for struct tm.tm_gmtoff ... found
checking for struct dirent.d_namlen ... not found
checking for struct dirent.d_type ... found
checking for sysconf(_SC_NPROCESSORS_ONLN) ... found
checking for openat(), fstatat() ... found
checking for getaddrinfo() ... found
checking for PCRE library ... found
checking for PCRE JIT support ... found
checking for zlib library ... found
creating objs/Makefile
Configuration summary
+ using system PCRE library
+ OpenSSL library is not used
+ using system zlib library
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
执行完后生成了Makefile和objs目录,objs目录里有src的目录层次以及
autoconf.err,Makefile,ngx_auto_config.h,ngx_auto_headers.h,ngx_modules.c
目录里都是空的
configure就是一个shell脚本,开头引入3个脚本
auto/options
shell新用法,把下面的循环写在脚本里,运行脚本,脚本的参数可以一一提取
for h
do
echo $h
done
options就是设置各种配置项,开关等,选项保存在NGX_CONFIGURE中,如果有help选项,输出帮助信息,然后退出。
默认支持HTTP,
NGX_SBIN_PATH=sbin/nginx,
NGX_MODULES_PATH=modules
NGX_CONF_PATH=conf/nginx.conf
NGX_CONF_PREFIX=dirname $NGX_CONF_PATH=conf
NGX_PID_PATH=logs/nginx.pid
NGX_LOCK_PATH=logs/nginx.lock
NGX_ERROR_LOG_PATH=logs/error.log
NGX_HTTP_LOG_PATH=logs/access.log
NGX_HTTP_CLIENT_TEMP_PATH=client_body_temp
NGX_HTTP_PROXY_TEMP_PATH=proxy_temp
NGX_HTTP_FASTCGI_TEMP_PATH=fastcgi_temp
NGX_HTTP_UWSGI_TEMP_PATH=uwsgi_temp
NGX_HTTP_SCGI_TEMP_PATH=scgi_temp
特殊处理了NGX_PERL_MODULES
auto/init
在options脚本中定义了NGX_OBJS=objs
NGX_MAKEFILE=objs/Makefile
NGX_MODULES_C=$NGX_OBJS/ngx_modules.c
NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h
NGX_AUTO_CONFIG_H=$NGX_OBJS/ngx_auto_config.h
NGX_AUTOTEST=$NGX_OBJS/autotest
NGX_AUTOCONF_ERR=$NGX_OBJS/autoconf.err
NGX_ERR=$NGX_OBJS/autoconf.err
MAKEFILE=$NGX_OBJS/Makefile
生成Makefile,没有用变量
default: build
clean:
rm -rf Makefile $NGX_OBJS
auto/sources
定义要编译的文件
CORE_MODULES="ngx_core_module ngx_errlog_module ngx_conf_module"
CORE_INCS="src/core"
CORE_DEPS="src/core/nginx.h \
...
CORE_SRCS="src/core/nginx.c \
...
EVENT_MODULES="ngx_events_module ngx_event_core_module"
EVENT_INCS="src/event src/event/modules"
EVENT_DEPS="src/event/ngx_event.h \
...
EVENT_SRCS="src/event/ngx_event.c \
...
SELECT_MODULE=ngx_select_module
SELECT_SRCS=src/event/modules/ngx_select_module.c
WIN32_SELECT_SRCS=src/event/modules/ngx_win32_select_module.c
POLL_MODULE=ngx_poll_module
POLL_SRCS=src/event/modules/ngx_poll_module.c
KQUEUE_MODULE=ngx_kqueue_module
KQUEUE_SRCS=src/event/modules/ngx_kqueue_module.c
DEVPOLL_MODULE=ngx_devpoll_module
DEVPOLL_SRCS=src/event/modules/ngx_devpoll_module.c
EVENTPORT_MODULE=ngx_eventport_module
EVENTPORT_SRCS=src/event/modules/ngx_eventport_module.c
EPOLL_MODULE=ngx_epoll_module
EPOLL_SRCS=src/event/modules/ngx_epoll_module.c
IOCP_MODULE=ngx_iocp_module
IOCP_SRCS=src/event/modules/ngx_iocp_module.c
FILE_AIO_SRCS="src/os/unix/ngx_file_aio_read.c"
LINUX_AIO_SRCS="src/os/unix/ngx_linux_aio_read.c"
UNIX_INCS="$CORE_INCS $EVENT_INCS src/os/unix"
UNIX_DEPS="$CORE_DEPS $EVENT_DEPS \
...
UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \
src/os/unix/ngx_time.c \
...
POSIX_DEPS=src/os/unix/ngx_posix_config.h
THREAD_POOL_MODULE=ngx_thread_pool_module
THREAD_POOL_DEPS=src/core/ngx_thread_pool.h
THREAD_POOL_SRCS="src/core/ngx_thread_pool.c
...
FREEBSD_DEPS/FREEBSD_SRCS/FREEBSD_SENDFILE_SRCS
LINUX_DEPS/LINUX_SRCS/LINUX_SENDFILE_SRCS
...
WIN32_INCS/WIN32_DEPS/WIN32_CONFIG/WIN32_SRCS/NGX_WIN32_ICONS/NGX_WIN32_RC
HTTP_FILE_CACHE_SRCS=src/http/ngx_http_file_cache.c
configure的工作
如果NGX_OBJS目录不存在,创建
在ngx_auto_headers.h文件中定义NGX_CONFIGURE宏,为option脚本中的NGX_CONFIGURE变量的值,形如"--xx --yy"
如果option指定了NGX_DEBUG,包含auto/have,在ngx_auto_headers.h文件中定义NGX_DEBUG为1
检查操作系统,uname -s,uname -r,uname -m
NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE";Linux:3.19.0-25-generic:x86_64
包含auto/cc/conf,
先调用auto/cc/name,检查$CC变量。
NGX_CC_NAME=gcc
再调用auto/cc/gcc,获取版本,have=NGX_COMPILER value="\"gcc $NGX_GCC_VER\"" . auto/define调用,定义宏NGX_COMPILER
ngx_feature="gcc -pipe switch"
调用auto/feature,生成代码,编译,不运行,打印found
再检查-Wl,-E switch,
再检查gcc builtin atomic operations
C99 variadic macros
gcc variadic macros
gcc builtin 64 bit byteswap(在生成的代码里加)
调用auto/headers
再调auto/include,包含此头文件,生成代码,编译
调用auto/os/conf
调用auto/os/linux
调用auto/feature,检查epoll,O_PATH,sendfile,prctl,sched_setaffinity,crypt_r,sys/vfs.h头文件是否存在
定义宏NGX_HAVE_NONALIGNED,NGX_CPU_CACHE_LINE = 64
调用auto/unix
NGX_USER=nobody,NGX_GROUP=nogroup
检查poll()函数,
检查/dev/poll,如果有,CORE_SRCS加上DEVPOLL_SRCS,EVENT_MODULES加上DEVPOLL_MODULE
检查kqueue's NOTE_LOWAT
...
检查int的长度,写代码,计算sizeof
...
mmap
...
调用auto/threads
定义NGX_THREADS,CORE_DEPS,CORE_SRCS,CORE_LIBS加上threads相关
调用auto/modules
加上EVENT_MODULES
http module
要编译的源代码都存在NGX_ADDON_SRCS变量
...
modules="$CORE_MODULES $EVENT_MODULES"
...
所有的module的会在objs/ngx_modules.c中申明
ngx_module_names,ngx_module_t *ngx_modules[]
调用auto/lib/conf
check各种库,pcre,libz等
调用auto/make
创建编译目录,生成obj/Makefile
调用auto/lib/make
为库生成makefile
调用auto/install
继续在obj/Makefile中生成install目标
调用auto/stubs
定义宏
调用auto/summary
打印某些变量的值
下面是configure输出的记录
+ Linux 3.19.0-25-generic x86_64
checking for C compiler ... found
+ using GNU C compiler
+ gcc version: 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.1)
checking for gcc -pipe switch ... found
checking for -Wl,-E switch ... found
checking for gcc builtin atomic operations ... found
checking for C99 variadic macros ... found
checking for gcc variadic macros ... found
checking for gcc builtin 64 bit byteswap ... found
checking for unistd.h ... found
checking for inttypes.h ... found
checking for limits.h ... found
checking for sys/filio.h ... not found
checking for sys/param.h ... found
checking for sys/mount.h ... found
checking for sys/statvfs.h ... found
checking for crypt.h ... found
checking for Linux specific features
checking for epoll ... found
checking for EPOLLRDHUP ... found
checking for EPOLLEXCLUSIVE ... not found
checking for O_PATH ... found
checking for sendfile() ... found
checking for sendfile64() ... found
checking for sys/prctl.h ... found
checking for prctl(PR_SET_DUMPABLE) ... found
checking for sched_setaffinity() ... found
checking for crypt_r() ... found
checking for sys/vfs.h ... found
checking for nobody group ... not found
checking for nogroup group ... found
checking for poll() ... found
checking for /dev/poll ... not found
checking for kqueue ... not found
checking for crypt() ... not found
checking for crypt() in libcrypt ... found
checking for F_READAHEAD ... not found
checking for posix_fadvise() ... found
checking for O_DIRECT ... found
checking for F_NOCACHE ... not found
checking for directio() ... not found
checking for statfs() ... found
checking for statvfs() ... found
checking for dlopen() ... not found
checking for dlopen() in libdl ... found
checking for sched_yield() ... found
checking for SO_SETFIB ... not found
checking for SO_REUSEPORT ... found
checking for SO_ACCEPTFILTER ... not found
checking for SO_BINDANY ... not found
checking for IP_BIND_ADDRESS_NO_PORT ... not found
checking for IP_TRANSPARENT ... found
checking for IP_BINDANY ...^C not found
checking for IP_RECVDSTADDR ... not found
checking for IP_PKTINFO ... found
checking for IPV6_RECVPKTINFO ... found
checking for TCP_DEFER_ACCEPT ... found
checking for TCP_KEEPIDLE ... found
checking for TCP_FASTOPEN ... found
checking for TCP_INFO ... found
checking for accept4() ... found
checking for eventfd() ... found
checking for int size ... 4 bytes
checking for long size ... 8 bytes
checking for long long size ... 8 bytes
checking for void * size ... 8 bytes
checking for uint32_t ... found
checking for uint64_t ... found
checking for sig_atomic_t ... found
checking for sig_atomic_t size ... 4 bytes
checking for socklen_t ... found
checking for in_addr_t ... found
checking for in_port_t ... found
checking for rlim_t ... found
checking for uintptr_t ... uintptr_t found
checking for system byte ordering ... little endian
checking for size_t size ... 8 bytes
checking for off_t size ... 8 bytes
checking for time_t size ... 8 bytes
checking for AF_INET6 ... found
checking for setproctitle() ... not found
checking for pread() ... found
checking for pwrite() ... found
checking for pwritev() ... found
checking for sys_nerr ... found
checking for localtime_r() ... found
checking for posix_memalign() ... found
checking for memalign() ... found
checking for mmap(MAP_ANON|MAP_SHARED) ... found
checking for mmap("/dev/zero", MAP_SHARED) ... found
checking for System V shared memory ... found
checking for POSIX semaphores ... not found
checking for POSIX semaphores in libpthread ... found
checking for struct msghdr.msg_control ... found
checking for ioctl(FIONBIO) ... found
checking for struct tm.tm_gmtoff ... found
checking for struct dirent.d_namlen ... not found
checking for struct dirent.d_type ... found
checking for sysconf(_SC_NPROCESSORS_ONLN) ... found
checking for openat(), fstatat() ... found
checking for getaddrinfo() ... found
checking for PCRE library ... found
checking for PCRE JIT support ... found
checking for zlib library ... found
creating objs/Makefile
Configuration summary
+ using system PCRE library
+ OpenSSL library is not used
+ using system zlib library
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
本文详细介绍了Nginx从配置到构建的具体流程,包括如何使用configure脚本进行配置、生成Makefile文件的过程以及编译模块的方式。文章还列举了Nginx的主要配置项和路径设置,并展示了编译过程中对操作系统特性、编译器特性的检测。
1万+

被折叠的 条评论
为什么被折叠?



