From 6707109f4b05cd679553607f23bde5baf1fcf3f9 Mon Sep 17 00:00:00 2001 From: nakasima Date: Fri, 7 Nov 2008 08:39:51 +0000 Subject: [PATCH] =?UTF-8?q?I/O=E3=83=AC=E3=82=B8=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E5=AE=9A=E7=BE=A9=E3=83=98=E3=83=83=E3=83=80=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=81=AE=E7=94=9F=E6=88=90=E3=81=AF=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@2 b871894f-2f95-9b40-918c-086798483c85 --- trunk/Makefile | 36 + trunk/bootrom/Makefile | 30 + trunk/bootrom/build/Makefile | 31 + trunk/bootrom/build/buildtools/commondefs | 354 +++++++++ trunk/bootrom/build/buildtools/modulerules | 103 +++ trunk/bootrom/build/libraries/Makefile | 31 + trunk/bootrom/build/libraries/init/Makefile | 33 + trunk/build/buildsetup/Makefile | 33 + trunk/build/buildsetup/ioreg/Makefile | 65 ++ .../ioreg/header_generator_ioreg.pl | 678 +++++++++++++++++ .../buildsetup/ioreg/io_register_list.csv | 500 +++++++++++++ .../buildsetup/ioreg/io_register_list.xls | Bin 0 -> 257536 bytes trunk/build/buildsetup/ioreg_sp/Makefile | 63 ++ .../ioreg_sp/header_generator_ioreg_sp.pl | 692 ++++++++++++++++++ .../buildsetup/ioreg_sp/io_register_list.csv | 500 +++++++++++++ .../buildsetup/ioreg_sp/io_register_list.xls | Bin 0 -> 257536 bytes trunk/build/buildsetup/versions/Makefile | 65 ++ trunk/build/buildsetup/versions/version.h | 20 + trunk/build/buildtools/@privatedefs | 21 + trunk/build/buildtools/_privatedefs | 21 + trunk/build/buildtools/commondefs | 488 ++++++++++++ .../build/buildtools/commondefs.add-ins.utest | 41 ++ trunk/build/buildtools/commondefs.cctype.CW | 510 +++++++++++++ trunk/build/buildtools/commondefs.cctype.RVCT | 321 ++++++++ trunk/build/buildtools/commondefs.cygpath | 152 ++++ trunk/build/buildtools/commondefs.emtype.ISD | 61 ++ trunk/build/buildtools/modulerules | 395 ++++++++++ .../build/buildtools/modulerules.add-ins.twl | 57 ++ .../buildtools/modulerules.add-ins.twldll | 53 ++ .../buildtools/modulerules.add-ins.utest | 67 ++ trunk/build/buildtools/modulerules.cctype.CW | 338 +++++++++ .../build/buildtools/modulerules.cctype.RVCT | 150 ++++ trunk/build/buildtools/modulerules.emtype.ISD | 41 ++ trunk/build/buildtools/modulerules.x86 | 158 ++++ trunk/build/buildtools/sdk_indent.pl | 80 ++ .../buildtools/template/Copyright.Header | 15 + .../build/buildtools/template/Function.Header | 12 + .../buildtools/template/Makefile.BuildSrc | 40 + .../template/Makefile.BuildSrc.ARM7 | 44 ++ .../buildtools/template/Makefile.BuildSubdir | 31 + trunk/build/buildtools/verinfo.cw.cc | 3 + trunk/build/buildtools/verinfo.cw.ld | 3 + trunk/build/buildtools/versiondefs | 20 + trunk/setup | 17 + 44 files changed, 6373 insertions(+) create mode 100644 trunk/Makefile create mode 100644 trunk/bootrom/Makefile create mode 100644 trunk/bootrom/build/Makefile create mode 100644 trunk/bootrom/build/buildtools/commondefs create mode 100644 trunk/bootrom/build/buildtools/modulerules create mode 100644 trunk/bootrom/build/libraries/Makefile create mode 100644 trunk/bootrom/build/libraries/init/Makefile create mode 100644 trunk/build/buildsetup/Makefile create mode 100644 trunk/build/buildsetup/ioreg/Makefile create mode 100644 trunk/build/buildsetup/ioreg/header_generator_ioreg.pl create mode 100644 trunk/build/buildsetup/ioreg/io_register_list.csv create mode 100644 trunk/build/buildsetup/ioreg/io_register_list.xls create mode 100644 trunk/build/buildsetup/ioreg_sp/Makefile create mode 100644 trunk/build/buildsetup/ioreg_sp/header_generator_ioreg_sp.pl create mode 100644 trunk/build/buildsetup/ioreg_sp/io_register_list.csv create mode 100644 trunk/build/buildsetup/ioreg_sp/io_register_list.xls create mode 100644 trunk/build/buildsetup/versions/Makefile create mode 100644 trunk/build/buildsetup/versions/version.h create mode 100644 trunk/build/buildtools/@privatedefs create mode 100644 trunk/build/buildtools/_privatedefs create mode 100644 trunk/build/buildtools/commondefs create mode 100644 trunk/build/buildtools/commondefs.add-ins.utest create mode 100644 trunk/build/buildtools/commondefs.cctype.CW create mode 100644 trunk/build/buildtools/commondefs.cctype.RVCT create mode 100644 trunk/build/buildtools/commondefs.cygpath create mode 100644 trunk/build/buildtools/commondefs.emtype.ISD create mode 100644 trunk/build/buildtools/modulerules create mode 100644 trunk/build/buildtools/modulerules.add-ins.twl create mode 100644 trunk/build/buildtools/modulerules.add-ins.twldll create mode 100644 trunk/build/buildtools/modulerules.add-ins.utest create mode 100644 trunk/build/buildtools/modulerules.cctype.CW create mode 100644 trunk/build/buildtools/modulerules.cctype.RVCT create mode 100644 trunk/build/buildtools/modulerules.emtype.ISD create mode 100644 trunk/build/buildtools/modulerules.x86 create mode 100644 trunk/build/buildtools/sdk_indent.pl create mode 100644 trunk/build/buildtools/template/Copyright.Header create mode 100644 trunk/build/buildtools/template/Function.Header create mode 100644 trunk/build/buildtools/template/Makefile.BuildSrc create mode 100644 trunk/build/buildtools/template/Makefile.BuildSrc.ARM7 create mode 100644 trunk/build/buildtools/template/Makefile.BuildSubdir create mode 100644 trunk/build/buildtools/verinfo.cw.cc create mode 100644 trunk/build/buildtools/verinfo.cw.ld create mode 100644 trunk/build/buildtools/versiondefs create mode 100644 trunk/setup diff --git a/trunk/Makefile b/trunk/Makefile new file mode 100644 index 0000000..781a92e --- /dev/null +++ b/trunk/Makefile @@ -0,0 +1,36 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrFirm - build +# File: Makefile +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +include $(CTRFIRM_ROOT)/build/buildtools/commondefs + +#---------------------------------------------------------------------------- + +SUBDIRS = \ +# build \ + +ifdef RVCT30BIN +SUBDIRS += \ + bootrom \ + +endif # RVCT30BIN + +#---------------------------------------------------------------------------- + +include $(CTRFIRM_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/trunk/bootrom/Makefile b/trunk/bootrom/Makefile new file mode 100644 index 0000000..8690b91 --- /dev/null +++ b/trunk/bootrom/Makefile @@ -0,0 +1,30 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrBrom - build +# File: Makefile +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +include $(CTRBROM_ROOT)/build/buildtools/commondefs + +#---------------------------------------------------------------------------- + +SUBDIRS = \ + build \ + +#---------------------------------------------------------------------------- + +include $(CTRBROM_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/trunk/bootrom/build/Makefile b/trunk/bootrom/build/Makefile new file mode 100644 index 0000000..89d4170 --- /dev/null +++ b/trunk/bootrom/build/Makefile @@ -0,0 +1,31 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrBrom - build +# File: Makefile +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +include $(CTRBROM_ROOT)/build/buildtools/commondefs + +#---------------------------------------------------------------------------- + +SUBDIRS = \ + $(CTRFIRM_ROOT)/build/buildsetup \ + libraries \ + +#---------------------------------------------------------------------------- + +include $(CTRBROM_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/trunk/bootrom/build/buildtools/commondefs b/trunk/bootrom/build/buildtools/commondefs new file mode 100644 index 0000000..a86807f --- /dev/null +++ b/trunk/bootrom/build/buildtools/commondefs @@ -0,0 +1,354 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrBrom - commondefs - common definitions for build system +# File: commondefs +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- +ifndef BROMSDK_COMMONDEFS_ +BROMSDK_COMMONDEFS_ = TRUE + +CTR_NO_STD_PCHDR = TRUE # プリコンパイルヘッダ抑止 +USE_MY_RULE_BIN = TRUE + + +EMPTY ?= +SPACE ?= $(EMPTY) $(EMPTY) + +# +# SDK Major Version +# + +BROMSDK_VERSION_MAJOR ?= 0 + +# EXO_PLATFORM = [TEG/TS] +EXO_PLATFORM ?= $(BROM_PLATFORM) + +# +# CodeGen Target +# +# BROM_PLATFORM = [TEG/TS] +# BROM_MEMSIZE = [64M/128M] +# BROM_CODEGEN = [ARM/THUMB] +# BROM_PROC = [ARM11/ARM9] +# +# BROM_PROMGEN = [TRUE/FALSE] +# BROM_TARGET = [BROM/NORFIRM/NANDFIRM/GCDFIRM/APP] +# + +BROM_PLATFORM ?= TEG +BROM_MEMSIZE ?= 128M +BROM_CODEGEN ?= THUMB +BROM_PROC ?= ARM11 +BROM_TARGET ?= BROM + +# replace TwlSDK +CTR_PLATFORM = $(BROM_PLATFORM) +CTR_MEMSIZE = $(BROM_MEMSIZE) +CTR_CODEGEN = $(BROM_CODEGEN) +CTR_PROC = $(BROM_PROC) + +# replace NitroSDK +ifndef CODEGEN_PROC +CODEGEN_PROC := $(BROM_PROC) +endif + +ifeq ($(BROM_CODEGEN),ALL) +BROM_CODEGEN_ALL ?= TRUE +override BROM_CODEGEN = ARM +endif + +ifeq ($(BROM_CODEGEN),ARM) +BROM_CODEGEN_ARCH = +else # ($(BROM_CODEGEN),THUMB) +BROM_CODEGEN_ARCH = .thumb +endif + +# +# C Compiler type +# +# CTR_CCTYPE = [CW/SNC/RVCT] +# + +# replace NitroSDK +CTR_CCTYPE := RVCT + +# +# SDK build type +# +# one of [BROM_DEBUG/BROM_RELEASE/BROM_FINALROM] +# + +ifdef BROM_DEBUG +BROM_BUILD_TYPE ?= DEBUG +BROM_BUILD_DIR ?= Debug + +else +ifdef BROM_FINALROM +BROM_BUILD_TYPE ?= FINALROM +BROM_BUILD_DIR ?= Rom + +else # BROM_RELEASE (default) +BROM_BUILD_TYPE ?= RELEASE +BROM_BUILD_DIR ?= Release + +endif +endif + +# replace TwlSDK +CTR_BUILD_TYPE ?= $(BROM_BUILD_TYPE) +CTR_BUILD_DIR ?= $(BROM_BUILD_DIR) + + +# +# PMIC Revision +# + +BROM_PMIC_REV ?= 100 + +# replace TwlSDK +CTR_PMIC_REV ?= $(BROM_PMIC_REV) + + +# +# Debugger Type +# +# one of [ISD/KMC/ARM] +# + +BROM_DEBUGGER ?= KMC + +# replace TwlSDK +CTR_DEBUGGER ?= $(BROM_DEBUGGER) + + +#---------------------------------------------------------------------------- +# BROM-SDK path settings +# + +BROM_ROOT := $(subst $(SPACE),\ ,$(subst \,/,$(CTRBROM_ROOT))) +BROM_BUILDTOOLSDIR := $(BROM_ROOT)/build/buildtools +BROM_BUILDSETUPDIR := $(BROM_ROOT)/build/buildsetup +BROM_INCDIR := $(BROM_ROOT)/include +BROM_TOOLSDIR := $(BROM_ROOT)/tools +BROM_KEYSDIR := $(BROM_ROOT)/build/keys +BROM_COMPONENTSDIR := $(BROM_ROOT)/components +BROM_ADDINS ?= $(BROM_ROOT)/add-ins + +BROM_CTRSDK_ROOT ?=$(shell cygpath -w $(CTRSDK_ROOT)) +BROM_CTRFIRM_ROOT ?=$(shell cygpath -w $(CTRFIRM_ROOT)) + +BROM_CTRFIRM_INCDIR := $(BROM_CTRFIRM_ROOT)/include +BROM_CTRFIRM_TOOLSDIR := $(BROM_CTRFIRM_ROOT)/tools + +BROM_BUILDARCH ?= $(CODEGEN_PROC)-$(BROM_PLATFORM)$(BROM_CODEGEN_ARCH) +BROM_BUILDARCH_ARM11 := ARM11-$(BROM_PLATFORM)$(BROM_CODEGEN_ARCH) +BROM_BUILDARCH_ARM9 := ARM9-$(BROM_PLATFORM)$(BROM_CODEGEN_ARCH) + +BROM_BUILDTYPE ?= $(BROM_BUILDARCH)/$(BROM_BUILD_DIR) +BROM_BUILDTYPE_ARM11 := $(BROM_BUILDARCH_ARM11)/$(BROM_BUILD_DIR) +BROM_BUILDTYPE_ARM9 := $(BROM_BUILDARCH_ARM9)/$(BROM_BUILD_DIR) + +BROM_LIBARCH := $(CODEGEN_PROC)-$(BROM_PLATFORM) +BROM_LIBTYPE := $(BROM_LIBARCH)/$(BROM_BUILD_DIR) +BROM_LIBDIR := $(BROM_ROOT)/lib/$(BROM_LIBTYPE) +BROM_LIBSYSCALLDIR := $(BROM_ROOT)/lib/$(BROM_LIBARCH)/etc +BROM_LIBSUFFIX := .brom$(BROM_CODEGEN_ARCH) + + +BROM_SPECDIR := $(BROM_INCDIR)/brom/specfiles +BROM_SPECARCH := $(BROM_LIBARCH) +ifneq ($(BROM_TARGET),BROM) +BROM_SPECARCH := $(BROM_SPECARCH)-$(BROM_TARGET) +endif +DEFAULT_BROM_LCFILE := $(BROM_SPECDIR)/$(BROM_SPECARCH).ldscript +ifndef BROM_PROMGEN +DEFAULT_BROM_LCFILE_TEMPLATE := $(BROM_SPECDIR)/$(BROM_SPECARCH)$(LCF_SUFFIX_).ldscript.template +DEFAULT_BROM_LCFILE_SPEC := $(BROM_SPECDIR)/$(BROM_SPECARCH).lsf +else # BROM_PROMGEN +DEFAULT_BROM_LCFILE_TEMPLATE := $(BROM_SPECDIR)/PROM.ldscript.template +DEFAULT_BROM_LCFILE_SPEC := $(BROM_SPECDIR)/PROM.lsf +endif # BROM_PROMGEN +DEFAULT_BROM_ROM_SPEC := $(BROM_SPECDIR)/ROM-$(CTR_PLATFORM).rsf + +BROM_LCF_MAPHDRS := $(BROM_INCDIR)/brom/hw/$(BROM_PROC)/mmap_global.h \ + $(BROM_INCDIR)/brom/hw/$(BROM_PROC)/mmap_brom.h \ + $(BROM_CTRFIRM_INCDIR)/firm/hw/$(BROM_PROC)/mmap_firm.h \ + $(BROM_CTRFIRM_INCDIR)/firm/hw/$(BROM_PROC)/mmap_wram.h \ + +ifeq ($(BROM_PROC),ARM11) +else # BROM_PROC == ARM9 +BROM_LCF_MAPHDRS += $(BROM_INCDIR)/brom/hw/$(BROM_PROC)/mmap_tcm.h +endif # BROM_PROC == ARM9 + + +# replace TwlSDK +CTR_BUILDARCH ?= $(BROM_BUILDARCH) + + +### Compiler & Linker settings + +#-include $(BROM_BUILDTOOLSDIR)/commondefs.cctype.$(CTR_CCTYPE) + +# replace NitroSDK +LCFILE_TEMPLATE ?= $(DEFAULT_BROM_LCFILE_TEMPLATE) +LCFILE_SPEC ?= $(DEFAULT_BROM_LCFILE_SPEC) +LCFILE_AUTOGEN ?= $(BINDIR)/$(notdir $(LCFILE_SPEC:.lsf=.autogen.ldscript)) +LCFILE ?= $(LCFILE_AUTOGEN) + +LDRES_FILE ?= # $(LDRES_AUTOGEN) + +LDEPENDS_LCF += $(BROM_BUILDTOOLSDIR)/commondefs $(BROM_LCF_MAPHDRS) +LDEPENDS_RES += $(BROM_BUILDTOOLSDIR)/commondefs + + +### SDK Library settings + +ifeq ($(BROM_TARGET),BROM) +ifndef BROM_PROMGEN +ifeq ($(CODEGEN_PROC),ARM11) +CRT0_O ?= crt0.o crt0_secure.o +else # CODEGEN_PROC==ARM9 +CRT0_O ?= crt0.o crt0_secure_sp.o +endif # CODEGEN_PROC==ARM9 +endif # BROM_PROMGEN +else # BROM_TARGET +CRT0_O ?= crt0_app.o +endif # BROM_TARGET + +ifdef BROM_DEF_LINK_SCATLD +CRT0_O += crt0_scat.o +endif # BROM_DEF_LINK_SCATLD + +ifeq ($(CODEGEN_PROC),ARM11) + +BROM_LIBS_BASE ?= \ + libos \ + libmi \ + libpxi \ + libsyscall \ + libswi \ + libpad \ + libpm \ + libgcd \ + libnvram \ + libacsign \ + libromsd \ + libprint_hex \ + libvlink \ + +ifdef BROM_PROFILE_TYPE +BROM_LIBS_BASE += libos.$(BROM_PROFILE_TYPE) +endif + +else # ($(CODEGEN_PROC),ARM9) + +BROM_LIBS_BASE ?= \ + libos_sp \ + libmi_sp \ + libpxi_sp \ + libswi_sp \ + libsyscall_sp \ + libpad_sp \ + libpm_sp \ + libgcd_sp \ + libnvram_sp \ + libaes_sp \ + libacsign_sp \ + libromsd_sp \ + libvlink_sp \ + +ifdef BROM_PROFILE_TYPE +BROM_LIBS_BASE += libos_sp.$(BROM_PROFILE_TYPE) +endif + +endif + +BROM_LIBS ?= $(CRT0_O) $(addsuffix $(BROM_LIBSUFFIX).a,$(BROM_LIBS_BASE)) + +BROM_LDEPENDS_DBG ?= $(CTRBROM_ROOT)/build/libraries/os/common/os_printf.c \ + +#---------------------------------------------------------------------------- +### CTR-commondefs +# +include $(CTRFIRM_ROOT)/build/buildtools/commondefs + +#---------------------------------------------------------------------------- +# MY BUILD TOOLS +# +MAKENORFIRM := $(BROM_CTRFIRM_TOOLSDIR)/bin/makenorfirm.exe +MAKENANDFIRM := $(BROM_CTRFIRM_TOOLSDIR)/bin/makenandfirm.exe +MAKEGCDFIRM := $(BROM_CTRFIRM_TOOLSDIR)/bin/makegcdfirm.exe +OPENSSL := $(BROM_CTRFIRM_TOOLSDIR)/openssl/openssl.exe + +MAKEFIRM_RSA_PRVKEY ?= $(shell cygpath -m $(BROM_CTRFIRM_TOOLSDIR))/openssl/rsa_private.der +MAKEFIRM_RSA_PUBKEY ?= $(shell cygpath -m $(BROM_CTRFIRM_TOOLSDIR))/openssl/rsa_public.der + +MAKEFIRM_FLAGS ?= + +ifneq ($(filter NORFIRM NANDFIRM GCDFIRM,$(FIRM_TARGET)),) +FIRM_STRIP_AXF := TRUE +endif + +#---------------------------------------------------------------------------- + +ifeq ($(CTR_PRIVATE),TRUE) +BROM_PRIVATE := TRUE +endif + +ifeq ($(CTR_WITH_ARM9),TRUE) +BROM_WITH_ARM9 := TRUE +endif + +#---------------------------------------------------------------------------- + +### Global Library resettings + +GINCLUDES := $(BROM_INCDIR) $(BROM_CTRFIRM_INCDIR) $(GINCLUDES) +GLIBRARY_DIRS := $(BROM_LIBDIR) $(GLIBRARY_DIRS) +GLIBRARIES := $(BROM_LIBS) \ + +# $(filter-out $(addsuffix $(CTR_LIBSUFFIX).a,$(BROM_LIBS_BASE)),$(GLIBRARIES)) + + +#---------------------------------------------------------------------------- +# CTRBROM_INSTALL_ROOT +# + +ifdef CTRBROM_INSTALL_ROOT +CTRBROM_INSTALL_ROOT_ := $(CTRBROM_INSTALL_ROOT) +else +CTRBROM_INSTALL_ROOT_ := $(CTRBROM_ROOT) +endif + +BROM_INSTALL_ROOT := $(subst $(SPACE),\ ,$(subst \,/,$(CTRBROM_INSTALL_ROOT_))) +BROM_INSTALL_INCDIR := $(BROM_INSTALL_ROOT)/include +BROM_INSTALL_TOOLSDIR := $(BROM_INSTALL_ROOT)/tools +BROM_INSTALL_LIBDIR := $(BROM_INSTALL_ROOT)/lib/$(BROM_LIBTYPE) +BROM_INSTALL_PROMDIR := $(BROM_INSTALL_TOOLSDIR)/prom +BROM_INSTALL_COMPONENTSDIR := $(BROM_INSTALL_ROOT)/components +BROM_INSTALL_ADDINS := $(BROM_INSTALL_ROOT)/add-ins + + +#---------------------------------------------------------------------------- +# Compiler flags +# +MACRO_FLAGS += -DBROM_PLATFORM_$(BROM_PLATFORM) \ + -DBROM_TARGET_$(BROM_TARGET) \ + -DBROM_KEYSDIR='$(BROM_KEYSDIR)' \ + -DMAKEFIRM_RSA_PUBKEY='$(MAKEFIRM_RSA_PUBKEY)' \ + -DBROM_ROOT='$(BROM_ROOT)' \ + + +#---------------------------------------------------------------------------- +endif # CTRBROM_COMMONDEFS_ +#----- End of commondefs ----- diff --git a/trunk/bootrom/build/buildtools/modulerules b/trunk/bootrom/build/buildtools/modulerules new file mode 100644 index 0000000..9162e02 --- /dev/null +++ b/trunk/bootrom/build/buildtools/modulerules @@ -0,0 +1,103 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrBrom - modulerules - common rules for build system +# File: modulerules +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- +ifndef BROMSDK_MODULERULES_ + + +ifdef MAKEFIRM_ARM11 +MAKEROM_ARM11 = $(MAKEFIRM_ARM11) +endif +ifdef MAKEFIRM_ARM9 +MAKEROM_ARM9 = $(MAKEFIRM_ARM9) +endif + +#---------------------------------------------------------------------------- +### CTR-modulerules +# +include $(CTRFIRM_ROOT)/build/buildtools/modulerules + +#---------------------------------------------------------------------------- + +# +# MAKENORFIRM / MAKENANDFIRM / MAKEGCDFIRM +# + +MAKEFIRM_ARM9 ?= $(MAKEROM_ARM9) +MAKEFIRM_ARM7 ?= $(MAKEROM_ARM7) + +MAKEFIRM_DEFS += -DFIRM_ROOT='$(BROM_CTRFIRM_ROOT)' \ + -DMAKEFIRM_ARM11='$(basename $(MAKEFIRM_ARM11))' \ + -DMAKEFIRM_ARM9='$(basename $(MAKEFIRM_ARM9))' \ + -DMAKEFIRM_RSA_PRVKEY='$(MAKEFIRM_RSA_PRVKEY)' \ + +SDEPENDS_BIN += $(MAKEFIRM_RSA_PRVKEY) + +FIRM_SDEPENDS_BIN := \ + $(call eupath,$(MAKEFIRM_ARM11)) \ + $(call eupath,$(MAKEFIRM_ARM9)) \ + + +.PHONY: bromtop bromlib bromdbg + +bromtop: + @$(MAKE) -C $(CTRBROM_ROOT) + +bromlib: + @$(MAKE) -C $(CTRBROM_ROOT)/build/libraries + +bromdbg: + @$(TOUCH) $(BROM_LDEPENDS_DBG) + @$(MAKE) -C $(CTRBROM_ROOT)/build/libraries/os + @+$(REMAKE) + + +# .srl +# .nor +$(BINDIR)/%.srl $(BINDIR)/%.nor: $(FIRM_SDEPENDS_BIN) $(FIRM_SPEC) $(LDEPENDS_BIN) $(EDEPENDS_BIN) $(MAKEFILE) + $(MAKENORFIRM) $(MAKEFIRM_FLAGS) $(MAKEFIRM_DEFS) $(FIRM_SPEC) $@ + +# .nand +$(BINDIR)/%.srl $(BINDIR)/%.nand: $(FIRM_SDEPENDS_BIN) $(FIRM_SPEC) $(LDEPENDS_BIN) $(EDEPENDS_BIN) $(MAKEFILE) + $(MAKENANDFIRM) $(MAKEFIRM_FLAGS) $(MAKEFIRM_DEFS) $(FIRM_SPEC) $@ + +# .gcd +$(BINDIR)/%.srl $(BINDIR)/%.gcd: $(FIRM_SDEPENDS_BIN) $(FIRM_SPEC) $(LDEPENDS_BIN) $(EDEPENDS_BIN) $(MAKEFILE) + $(MAKEGCDFIRM) $(MAKEFIRM_FLAGS) $(MAKEFIRM_DEFS) $(FIRM_SPEC) $@ + +# .sbin +$(BINDIR)/$(TARGET_BIN_BASENAME).sbin: $(BINDIR)/$(TARGET_BIN_BASENAME).axf $(BINDIR)/$(TARGET_BIN_BASENAME).txt + objcopy -I elf32-little -O binary $< $@ + +# $(FROMELF) --bin -o $@ $< + + +# .padbin +$(BINDIR)/$(TARGET_BIN_BASENAME).padbin: $(BINDIR)/$(TARGET_BIN_BASENAME).sbin + objcopy -I binary -O binary --pad-to $(EXO_SBIN_SIZE) --gap-fill 0x00 $< $@ + + +# .txt +$(BINDIR)/$(TARGET_BIN_BASENAME).txt: $(BINDIR)/$(TARGET_BIN_BASENAME).axf + $(FROMELF) --32x1 -cd -o $@ $< + +# .exo +$(BINDIR)/$(TARGET_BIN_BASENAME).exo: $(BINDIR)/$(TARGET_BIN_BASENAME).sbin + objcopy -I binary -O srec $< $@ + +#---------------------------------------------------------------------------- +BROMSDK_MODULERULES_ = TRUE +endif # BROMSDK_MODULERULES_ +#----- End of modulerules ----- diff --git a/trunk/bootrom/build/libraries/Makefile b/trunk/bootrom/build/libraries/Makefile new file mode 100644 index 0000000..5e65733 --- /dev/null +++ b/trunk/bootrom/build/libraries/Makefile @@ -0,0 +1,31 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrBrom - libraries +# File: Makefile +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +include $(CTRBROM_ROOT)/build/buildtools/commondefs + +#---------------------------------------------------------------------------- + +SUBDIRS = \ + init \ + + +#---------------------------------------------------------------------------- + +include $(CTRBROM_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/trunk/bootrom/build/libraries/init/Makefile b/trunk/bootrom/build/libraries/init/Makefile new file mode 100644 index 0000000..76b0138 --- /dev/null +++ b/trunk/bootrom/build/libraries/init/Makefile @@ -0,0 +1,33 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrBrom - libraries - init +# File: Makefile +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +include $(CTRBROM_ROOT)/build/buildtools/commondefs + +#---------------------------------------------------------------------------- + +SUBDIRS = # ARM11 + +#ifdef CTR_WITH_ARM9 +SUBDIRS += ARM9 +#endif + +#---------------------------------------------------------------------------- + +include $(CTRBROM_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/trunk/build/buildsetup/Makefile b/trunk/build/buildsetup/Makefile new file mode 100644 index 0000000..5e51b07 --- /dev/null +++ b/trunk/build/buildsetup/Makefile @@ -0,0 +1,33 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: NitroSDK - buildsetup - create register map +# File: Makefile +# +# Copyright 2003-2004 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords:$ +#---------------------------------------------------------------------------- + +include $(CTRFIRM_ROOT)/build/buildtools/commondefs + + +#---------------------------------------------------------------------------- +ifdef NITRO_PRIVATE +SUBDIRS += # versions +endif + +SUBDIRS += ioreg ioreg_sp # fx + +#---------------------------------------------------------------------------- + +include $(CTRFIRM_ROOT)/build/buildtools/modulerules + + +#----- End of Makefile ----- diff --git a/trunk/build/buildsetup/ioreg/Makefile b/trunk/build/buildsetup/ioreg/Makefile new file mode 100644 index 0000000..20931ac --- /dev/null +++ b/trunk/build/buildsetup/ioreg/Makefile @@ -0,0 +1,65 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrBrom - buildsetup - create register map +# File: Makefile +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords:$ +#---------------------------------------------------------------------------- + +SUBDIRS = + +#---------------------------------------------------------------------------- + +WORKDIR = ctr/hw/ARM11 +TARGET = $(WORKDIR)/ioreg.h + +CSVSRC = io_register_list.csv +SCRIPT = header_generator_ioreg.pl + +NEWDIRS = $(WORKDIR) + +#---------------------------------------------------------------------------- + +TARGET_PREFIX = $(subst .h,,$(TARGET)) +TARGET_SUBFILES = $(TARGET_PREFIX)_*.h +TARGET_TMPCSV = $(TARGET_PREFIX).csv + +# build +TARGETS = $(TARGET) $(TARGET_SUBFILES) + +# install +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(CTR_INSTALL_INCDIR)/$(WORKDIR) +override DO_INSTALL = $(DO_INSTALL_WILDCARD) + +# clean/clobber +LDIRT_CLEAN = $(TARGET_TMPCSV) $(TARGETS) \ + $(firstword $(subst /, ,$(WORKDIR))) +LDIRT_CLOBBER = + +include $(CTRSDK_ROOT)/build/buildtools/commondefs + + +#---------------------------------------------------------------------------- + +do-build: $(TARGET) + +$(TARGET): $(CSVSRC) $(SCRIPT) + $(CP) $(CSVSRC) $(TARGET_TMPCSV) + $(PERL) $(SCRIPT) $(TARGET_TMPCSV) + +#---------------------------------------------------------------------------- + +include $(CTRSDK_ROOT)/build/buildtools/modulerules + + +#----- End of Makefile ----- diff --git a/trunk/build/buildsetup/ioreg/header_generator_ioreg.pl b/trunk/build/buildsetup/ioreg/header_generator_ioreg.pl new file mode 100644 index 0000000..9cfd2b3 --- /dev/null +++ b/trunk/build/buildsetup/ioreg/header_generator_ioreg.pl @@ -0,0 +1,678 @@ +#!/usr/bin/perl -s + +############################################################################## +# +# Project: CtrSDK - header generator - +# File: header_generator_ioreg.pl +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +############################################################################## + +# +# ヘッダファイルのマクロ生成スクリプト +# +# 使用法: +# conv.pl [-v] [-dup] filename1.csv [filename2.csv ...] +# +# CSVファイルからマクロの定義が書かれているヘッダファイル +# filename1.h (filename2.h...)を出力します。 +# +# CSVファイルのフォーマットについては(SDKRoot)/docs/private/how-to-make-headers.txt +# をご覧下さい。 +# + +use Text::ParseWords; + +# +# グローバル変数 +# +$line_no = 0; +%name_hash = (); +@hash_array = (); + + + + +# +# verbose出力 +# +sub verbose { + if ($verbose_mode == 1) { + print STDERR @_; + } +} + + + + +# +# フィールドの最初と最後の空白を取り除く +# +sub trim { + my @out = @_; + for (@out) { + s/^\s+//; + s/\s+$//; + } + return @out; +} + + + + +# +# CSV解析ルーチン +# +sub parse_csv { + my @fields = quotewords(",", 0, shift @_); + @fields = trim(@fields); + + my $tmp; + # 行末の,,,,を取り除く + while(defined($tmp = pop @fields) && $tmp =~ /^$/ ) { + ; + } + push @fields, $tmp; + + return @fields; +} + + + + +# +# プリプロセッサ +# +sub preprocess { + return parse_csv(shift @_); +} + + + + +# +# マクロ名の重複チェック +# + +sub check_macro_duplicate { + my $name = shift @_; + my $condition = shift @_; + my $no = shift @_; + + if ($condition ne "") { + return 0; + } + + if (exists $name_hash{$name}) { + if ($duplicate_ok == 1) { + print STDERR "WARNING: generating duplicate macro \'$name\' in line $no\n"; + } else { + die "ERROR: duplicate macro \'$name\' in line $no"; + } + return 1; + } else { + $name_hash{$name} = 1; + return 0; + } +} + + + +# +# 解析 +# +sub analyze { + my @fields = @_; + + my $fields; + my $tmphash; + my $address, $condition, $name, $bitwidth, $rw, $category, $volatile; + $tmphash = {}; + + $address = shift @fields; + die "ERROR: Illegal address \'$address\' in line $line_no\n" unless ($address =~ /^0x[0-9A-Fa-f]+$/); + + $condition = shift @fields; + die "ERROR: Illegal condition name \'$condition\' in line $line_no\n" unless ($address =~ /^[A-Za-z0-9_()&|!]+$/); + + $name = shift @fields; + die "ERROR: Illegal macro name \'$name\' in line $line_no\n" unless ($name =~ /^[A-Za-z0-9_]+$/); + check_macro_duplicate($name, $condition, $line_no); + + + $bitwidth = shift @fields; + if ($bitwidth eq "8") { + $mask_format = "0x%02x"; + } elsif ($bitwidth eq "16") { + $mask_format = "0x%04x"; + } elsif ($bitwidth eq "32") { + $mask_format = "0x%08x"; + } elsif ($bitwidth eq "64") { + $mask_format = "0x%016x"; + } else { + die "ERROR: Illegal bitwidth \'$bitwidth\' in line $line_no\n"; + } + + + $rw = shift @fields; + $category = shift @fields; + $volatile = shift @fields; + + $tmphash->{"condition"} = $condition; + $tmphash->{"name"} = $name; + $tmphash->{"offset"} = $address; + $tmphash->{"bitwidth"} = $bitwidth; + $tmphash->{"rw"} = $rw; + if ($rw eq "r") { + $tmphash->{"const"} = "const"; + } else { + $tmphash->{"const"} = ""; + } + + $tmphash->{"category"} = $category; + + if ($volatile eq "volatile") { + $tmphash->{"volatile"} = "v"; + } elsif ($volatile eq "permanent") { + $tmphash->{"volatile"} = ""; + } else { + die "ERROR: specify volatile/permanent in line $line_no\n"; + } + + @{$tmphash->{"option"}} = splice @fields, 0; + + $tmphash->{"mask_format"} = $mask_format; + $tmphash->{"line_no"} = $line_no; + return $tmphash; +} + + +# +# 配列へ要素を追加 +# 重複があれば線形リストとしてつなげる +# +sub push_fields { + my $hash = shift @_; + my $array_num; + my $tmp_hash; + + # 既に同じ名前のものが登録されている場合はハッシュテーブルへ線形リストとして追加 + if ( exists($index_name_hash{ $hash->{"name"} }) ) { + $array_num = $index_name_hash{ $hash->{"name"} }; # 対応する配列のインデックスを取得 + # (condition eq "")のものが線形リストの最後になるよう追加 + $tmp_hash = $hash_array[ $array_num ]; + if ( $tmp_hash->{"condition"} eq "") { + $hash->{"next"} = $tmp_hash; + $hash_array[ $array_num] = $hash; + return; + } + + while ( exists($tmp_hash->{"next"}) ) { + if ($tmp_hash->{"next"}->{"condition"} eq "") { + $hash->{"next"} = $tmp_hash->{"next"}; + $tmp_hash->{"next"} = $hash; + return; + } + $tmp_hash = $tmp_hash->{"next"}; + } + $tmp_hash->{"next"} = $hash; + } else { + $array_num = @hash_array; + $index_name_hash{ $hash->{"name"} } = $array_num; + push @hash_array, $hash; + } +} + + +# +# カテゴリ情報収集 +# +sub collect_category { + my %cat_hash; + my $hash; + foreach $hash (@hash_array) { + $cat_hash{$hash->{"category"}} = 1; + } + return (keys %cat_hash); +} + +# +# 条件のマージ +# +sub merge_condition { + my $cond1 = shift @_; + my $cond2 = shift @_; + my $name = shift @_; + + my $merged_cond; + + if ( $cond1 eq "" || $cond2 eq "") { + $merged_cond = ""; + return $merged_cond; + } + + if ( "$cond1" eq "!$cond2" || "!$cond1" eq "$cond2" ) { + $merge_cond = ""; + } else { + $merged_cond = "$cond1 || $cond2"; + } + + return $merged_cond; +} + + +# +# レジスタのオフセット定義取得 +# +sub cull_register_offset_def { + my $hash = shift @_; + + my $offset_name; + my @tmp_hash; + my @def_array = (); + my $i, $k; + + $i = 0; + while ( 1 ) { + + { + $offset_name = "REG_$hash->{'name'}_OFFSET"; + $hash->{"offset_def"} = $offset_name; + $hash->{"address_def"} = "REG_$hash->{'name'}_ADDR"; + # この変数の定義は後で使用するので残しておく + $hash->{"valname_def"} = "REG_$hash->{'category'}_$hash->{'name'}"; + $hash->{"valname_def_new"} = "reg_$hash->{'category'}_$hash->{'name'}"; + } + + $tmp_hash[$i]->{"condition"} = $hash->{"condition"}; + $tmp_hash[$i]->{"name"} = $hash->{"name"}; + $tmp_hash[$i]->{"offset_def"} = $hash->{"offset_def"}; + $tmp_hash[$i]->{"offset"} = $hash->{"offset"}; + $tmp_hash[$i]->{"address_def"} = $hash->{"address_def"}; + $tmp_hash[$i]->{"valname_def"} = $hash->{"valname_def"}; + $tmp_hash[$i]->{"valname_def_new"} = $hash->{"valname_def_new"}; + + my $val = "(*($hash->{'const'} REGType$hash->{'bitwidth'}$hash->{'volatile'} *) $hash->{'address_def'})"; + + $tmp_hash[$i]->{"reg_type"} = $val; + + my $find_flg = 0; + + #reg_typeとoffsetが同じならconditionをマージ + foreach $k (@def_array) { + if ( $k->{'condition'} eq "" ) { + # 条件無しのフィールドは最後に来るはずで、先に既に存在する場合は条件設定がおかしい + print STDERR "WARNING: illegal condition in \'$k->{'name'}\'\n"; + } + + if ( ($k->{"reg_type"} eq $tmp_hash[$i]->{"reg_type"}) && ($k->{"offset"} eq $tmp_hash[$i]->{"offset"}) ) + { + $k->{'condition'} = merge_condition( $k->{'condition'}, $tmp_hash[$i]->{'condition'}, $k->{'name'} ); + $find_flg = 1; + last; + } + } + if ($find_flg == 0) { + push @def_array, $tmp_hash[$i]; + $i++; + } + + # リストにまだ残っているなら次を処理 + if (exists($hash->{"next"})) { + $hash = $hash->{"next"}; + } else { + last; + } + } + + return @def_array; +} + + +# +# アウトプット +# +sub output { + my $output_filename = shift @_; + my $category = shift @_; + + # 出力ファイルのオープン + + open OUT, ">$output_filename" or die "ERROR: Cannot create file \'$output_filename\'\n"; + my $handle = OUT; +# my $handle = STDOUT; + + my $include_guard = $output_filename; + $include_guard =~ s/[.\/]/_/g; + $include_guard = uc($include_guard). "_"; + + # + # 出力 + # + print $handle < +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Definition of Register offsets, addresses and variables. + */ + + +ENDDOC + my $hash, $tmp_hash; + + foreach $hash (@hash_array) { + next if ($hash->{"category"} ne $category); + + print $handle "/* $hash->{'name'} */\n\n"; + + my @reg_array = cull_register_offset_def($hash); # 重複した項目を最適化 + my $nest_state = 0; + + foreach $tmp_hash (@reg_array) + { + if ($tmp_hash->{"condition"} ne "") { + if ($nest_state == 0) { + $nest_state = 1; + printf $handle "#if %s\n\n", $tmp_hash->{'condition'}; + } elsif ($nest_state == 1) { + printf $handle "\n#elif %s\n\n", $tmp_hash->{'condition'}; + } + } elsif ($nest_state == 1) { + printf $handle "\n#else\n\n"; + } + + printf $handle "#define %-50s %s\n", $tmp_hash->{'offset_def'}, $tmp_hash->{'offset'}; + printf $handle "#define %-50s %s\n", $tmp_hash->{"address_def"}, "(HW_REG_BASE + $tmp_hash->{'offset_def'})"; + printf $handle "#define %-50s %s\n", $tmp_hash->{"valname_def_new"}, $tmp_hash->{"reg_type"}; + + if ($nest_state == 1) { + printf $handle "// endif %s\n", $tmp_hash->{"condition"} + } + } + + printf $handle "\n"; + if ($nest_state == 1) { + printf $handle "#endif\n\n"; + } + } + + print $handle <{"category"} ne $category); + + $nest_state = 0; + + printf $handle "\n"; + print $handle "/* $hash->{'name'} */\n"; + + while ( 1 ) { + if ($hash->{"condition"} ne "") { + if ($nest_state == 0) { + $nest_state = 1; + printf $handle "#if %s\n", $hash->{'condition'}; + } elsif ($nest_state == 1) { + printf $handle "#elif %s\n", $hash->{'condition'}; + } + } elsif ($nest_state == 1) { + printf $handle "#else\n"; + } + + my $no = $hash->{"line_no"}; + + my @array = @{$hash->{"option"}}; + + my $field_macro_func = "#define $hash->{'valname_def'}_FIELD("; + my $field_macro_flag = 0; + my $field_macro_body = " (u$hash->{'bitwidth'})( \\\n"; + + my $fieldname, $fieldshift, $fieldsize; + while($fieldname = shift @array) { + my $shift_macro; + + die "ERROR: Field option not good in line $no\n" if (!defined($fieldshift = shift @array)); + die "ERROR: Field option not good in line $no\n" if (!defined($fieldsize = shift @array)); + + print $handle "\n"; + + # REG_XXX_XXXXX_SHIFTの出力 + { + my $name = "$hash->{'valname_def'}_" . $fieldname . "_SHIFT"; + check_macro_duplicate($name, $hash->{'condition'}, $no); + $shift_macro = $name; + printf $handle "#define %-50s %s\n", $name, $fieldshift; + } + + # REG_XXX_XXXXX_SIZEの出力 + { + my $name = "$hash->{'valname_def'}_" . $fieldname . "_SIZE"; + check_macro_duplicate($name, $hash->{'condition'}, $no); + printf $handle "#define %-50s %s\n", $name, $fieldsize; + } + + # REG_XXX_XXXXX_MASKの出力 + { + my $width = $hash->{"bitwidth"}; + my $mask_val = 1 << $fieldshift; + my $tmp = $mask_val; + my $i; + for ($i = 0; $i < $fieldsize - 1; $i++) { + $mask_val = $mask_val << 1; + $mask_val = $mask_val + $tmp; + } + my $name = "$hash->{'valname_def'}_" . $fieldname . "_MASK"; + check_macro_duplicate($name, $hash->{'condition'}, $no); + printf $handle "#define %-50s $hash->{'mask_format'}\n", $name, $mask_val; + } + + # REG_XXX_XXXXX_FIELDの定義の一行分を作成 + my $fn = lc($fieldname); + if ($field_macro_flag == 1) { + $field_macro_func = $field_macro_func . ", " . $fn; + $field_macro_body = $field_macro_body . " | \\\n" . " ((u32)($fn) << $shift_macro)"; + } else { + $field_macro_func = $field_macro_func . " " . $fn; + $field_macro_body = $field_macro_body . " ((u32)($fn) << $shift_macro)"; + $field_macro_flag = 1; + } + } + + if ($field_macro_flag == 1) { + # REG_XXX_XXXXX_FIELDの出力 + $field_macro_func .= " ) \\\n"; + $field_macro_func .= $field_macro_body; + print $handle "\n#ifndef SDK_ASM\n"; + print $handle $field_macro_func, ")\n"; + print $handle "#endif\n\n" + + } + if ($nest_state == 1) { + printf $handle "// endif %s\n", $hash->{"condition"}; + if ( !exists($hash->{"next"})) { + printf $handle "#endif \n\n"; + } + } + + # リストにまだ残っているなら次を表示 + if (exists($hash->{'next'})) { + $hash = $hash->{'next'}; + } else { + last; + } + } + } + + print $handle <) { + $line_no++; + $line =~ s/\"//g; + $line =~ s/\#.*//; + next if ($line =~ /^[\s,]*$/); + + @fields = preprocess($line); + push @hash_array, analyze(@fields); + } + verbose("$line_no lines read\n"); + + my @categories = collect_category(); + my $category; + my @headerfile_array = (); + + + foreach $category (@categories) { + my $output_filename = $filename; + if (($output_filename =~ s/\.csv/\.h/) == 0) { + $output_filename .= ".h"; + } + $output_filename =~ s/\.h/_$category.h/; + + push @headerfile_array, $output_filename; + + verbose("Output filename is $output_filename\n"); + output($output_filename, $category); + } + + my $master_filename = $filename; + if (($master_filename =~ s/\.csv/\.h/) == 0) { + $master_filename .= ".h"; + } + + open MASTER, ">$master_filename" or die "ERROR: Cannot create file \'$master_filename$'\n"; + + my $include_guard = $master_filename; + $include_guard =~ s/[.\/]/_/g; + $include_guard = uc($include_guard). "_"; + + print MASTER <\n" + } + + print MASTER <e{!03Ci`fdFF*fdCV*z}PqtBfxQ7 z-!{ID;{)R(&DEr74(F)jG-;ZoNt3ooleTH;n3{ zkUl?1bf2cr%hUzx&j0HfmH}92!=eN2^H+`&E#qU!&FBJT$XL zCqND^RBFzaIi*WVOH(W1k1b2-&sn1{0bP-ZqCsV3ryOtmDGVQql78ZPw^g zRitJ~3a1t#t5u6sg;ISeUjpLOu){k*nSm6=_gGeSPksHEOXck37`U@^fWQZgY;um zSxoxanDnAxdQt3iv3*IUes#WTfM05KBgx4a_*19DtdoR4M=x^HExnswpc;VOr@zkB z@6x|5CVg5=`nZ_-@uBeJwX?Vw+Mo2(&o74l2GR?P8?eV-J=ew1zbz(xT1@)5nEDj} z9eS?Ce{l@{Zo0+aO}F^F=@x%C-Qw@2Tl}5$ZzK5dGulc2l`2rkF%M6o4$xbEx%F6n zx#^Z)Zo1`{n{N5#rdxiw>6Tw^y5*OX{-PNd%IX2^XHuyb4PU%;!xt~z@Wo3veDTr^ zU)=P^49;%)iv}Mr-QeS;8+^QUgO8VP@Nv^wP8>b(qLFi#{#WWckRKS24$i+)H|lh! z9;Wxw_Y)(0Iec5Vejo?7`Et8IMxR)Ex1E;WNq^DMd;RT?(R=+d`lSE5hGYmITaWYH zU)g$`^cM}i*Pdd7!?GCtvPYi_tn= ze*=cUYR0c8Z^h$OvLPT3=Z|X$ruWCB-x!nrwwUy3G3htP$iujC4MBZ-T}(Y->j&v= z`r_n+g`-vR@iDLA@AHor(eDe6kEP!i9v?-&ryd_izb`sIntrR}ihf^weEe%$3km_= zTh&Ze@g>B0s@lD;@4${-yRW}t$AP}R@M~F5@4CCyXmthr`)olG{8wu0?gI5|H6!_> z$x3xXaAT|*4Wg)e)0KT)tp(sBjaAiH8~u#2nYDc#v3Zs8c};e_0wx%oM^WcfG{f7s7dA1u(<@vf%ohLJ$uVgw@()JOa>9vRRs^jzEiLvG2 zfnFZ>F_otqO;vd^)A>rKLnXN%DZf3OR~4TJPxSg>%fSP^Jln@~ZLk}vqiJnlQx%M& z)S;?W)pGcQQmSoAzfGyJDcfvHtxef(Qqn1#GGJ56ZORUtQejhe+LTI@QjNv&>1o@Z zYAjAEwmsEYoKkFis2bt?MhV2^ScvCI<_Isa1%& zyRkD&y#mEVb-I{sYz|W@7mS{cOqg;#KqJ7&bocai#~?Sx?HUrVYl-Qa+lb}E z<_J>e<;WzbA+|uck1j`ude|Hx>KKl=LbrU_99bUA5#?}Xc|MMKT{{CuCJ1JirwmKR z1qR9aK51T_tcT!qRFbH2ED^_)5P2+DTvT-JF>F!F?PngoxTJX)Bh^58Dj#Q_o8tB_ zFKezXaN1EmeAXaogf%`he|NIe7Fz;YeOtU=PetZ8tuwk5)>@uZ5#htC=!A1-SuV_D-v63ZHQ z@+hy&#~QzXd0FG>;Hu%X21)a>=H*e2nAj4-WDSwWvgX*Zk#UHm}zS7Y01c1In>bH(U{GE z^&Yj{aSEbGLS}PIw#Utdb(Ws4p2l?`6o#<3E7J_$T*A@1nvSk!r*W{Ht+Up)Y>Fw= zv_9)(O|pfuE#8w1MjIN}wKvC9*pY2n=VqB!Krh{#3A%kXtP!6I(i*9P}Tll^&N&>$5HCu1@bshV!lM z8DCIMUg}W!_LOW!!a|bmZubOtsxtjL;4p6{OJH}qtZ!z1<`i4z_(LIK2U~jGT0eIx zKhYK5nYK!Qpd@T#ni|(PXBvAP;V!n>&F$IlY)_*%n9QhX?{qo|fnlYx=}e>k)nsI& zbl=XM*YCJN0)oCKadZ2=!GYa3?A|vh^LN_j5B6W{i~(-`_Wm1o?AmwWuq;^sJ8GzA zJA&S_f5(Aq`v-RnI!(C2YR>Dg*}c=rgS8f2Nh#SZ1pDuwhRJ!vStT7o`b07_@20O z&Wvt%2EbI?MPGpxTlE$+5qLJpW*n`bQ+)2o;hg5!GTvyL8U?z-8B_v}@_^i%QG;le z2gEcY7v&*IjOL#~uF6Al6&VJVRe5BjJRk==_2VF_^dv0Wvw$2#pPWyI&@Yt@6Jxs~ zKWG(a0IlK-pjDg!v}%vvk%3ilCeW%q$RnVk_wIH)0$O!Gz|muL%SNiM%nw@S89=K% z189|J0IkO3cLcP`Gl5p?K_2Z{0JPC+3@&_@s?VgJOMTZV&DK+Cw!KS2R&3{Zu<_h+ z{n@={&^SiVxY%=W1>4=!yd` z+aAa>EJP1P0>iFIH)h&Q%szCM$b9o5D2k4%ehClfWm;R;J2nyL^|X54a}g|C(&KQTuj}ax z3A6zz>>QL?frSbX3TMQYS;^~mXRWBxbM2Ff7TgRVm+Eu+Qy%A0^w@`anz_feGTe!e zr;P8KX>s&GkF@}s+cSMxXBJ`MqD)7($V^9?WoBCPQizuK&;pAMqTQEuo;oTbBbAQk zWvkhPhetEjnejBTjqBkP{Xme&b@0o@1gWeubXhWC8uqPBqkT{YoLVJ9ejL&aq0%*7 zUMw&-xl}ogVV*##_yG&9isTlI4l{zhxd61i&hn=M){vPNFD%JE9doe;Dyo1p6m3*L2OzPLEZ>HW2e}BT^R}ZXilIrScZ13#uqkyW%w}e#*-LA1V)$y15In(q!D=>w zeIJ|I7LNBt#jxM8|5&m+((ZK3wQ5|;oxVj&dZRiwIQt!glm{o_#!42rrEJgxX3z3Xt;={jkt)bjX1;AMx3$E z5$Q2e(Q!n&z;?!+c6c!f#;c=>7*5D?`V-A^S`p21k#c8SUb8a;%&RzN938M6 zcg3W``a`Kh73KX-H`t_tr@?gA=RM7+R4VJRkRwV|wmffH7xqY5RPugVV>5T8Av;iY zG`qqtZM_Lt^ObW_l-=9ogd9pa9s@2S8w2s;O+PxJCjwdXRJ(}NvazG311v<>2WI1} z#kcENcw5pfajoj;c9kucf-Hw|k$zUByg_6FyxdYJ_*r57)!yFnzKX#C*-`cnF}M8s z8)9=)dCR6kWm#WTxWi(ro$SKX#5k*?J6)~DhGD0x)FL^KP8*Y}%~5Hb)6woAp36zc z^gRs>rFX6Idj?AT#hrIA~_D%BRLM& zv!jjY=y5%l<8qy)%j0@3C*#Ni=XA6?W>+pJ9hcMI>V<9X_KsHXIYx*YovAls7y3dJ z$@GP&$;PtRND;!48&1IE)S!Ou&EVuj}*L9(kZMiO;oR@7@iW#tw}3 zNdAqo`o=XRN99+@k*H>+8>nH=q`PswYX-A^b5#MWL@%7jV=%qi5xy+!Q8v@|pQrvE zVmf~S;i)gC{uTcEv4hbCR$;Wbx)@t)D*0&Y1*pIc49(1$xm9jg+1y^;wa!tlTr9h~ zz12Z|rq$PQhGTt)BXJ2hM5Px1@URu0BQYCxCFdBhth?Y<07rQI3Wi&{+Aj^;d1Fd@ zIn`0HoZ&i?S2nm~&hWrPKarMu>+0RUX^kNI?v^Sm9O($0sk(9 zZZV7-KVH6Jn~^$H?FxOhRSk3+&GuyVca*=$H`rG&6iZ zkot$zw^E;lPYE?|2!ndljotALhD>kQwz5J?nXO%!4p)U{N1FvZqR6y#xA+t$+)fnj z&S2slHk8}7-q95dCuDp3#-puE^_{78DOjJ#-?~&^zShCPV!w4PlGQ0^bn(77jXP>G z$(Sv6@^K%^!E^6Q?spYad=XrQmN)qtI1VZgPAWq?ww`qr$f&Gp25miv_TFY*| z-tf$hUZs-B9E!2K2Q`ZRzO}3kp<%Bat>8Sp+-2C0 zu`$z8+Zr$cj4gxN8EbP(y-j_M>2ymr>z)bWoi(tN zF)bfF$ttYQ_MS{vQ(w!**urQMx`mB>x-Q-9)oZevJ&3q7Fk^Y8%uHxn1J+$^bF$DG zw>c4ZyCas@dUT!>m?ljgBeYk4pUf3V`kd(u~|uH*TH=c z@fAa6e8q4uBfeskK3BJ}3*tJBJYROTwmRMkw-hU^aAsg$;5s02V=?dQcKXIxcXc}* zi*8&_xhwlGq>RGrZLDElv^X5sB=g7QJfmI$NwxLaV8VZ+{#Oa$} zxHu#}uQpF!O`g2!Jb8fwWRX!+wcTZ{?I2uL6WdU@#U(y3fOh18?tTfj0DIy3kN8US z^d7EF@yeM=rMI!KrLno$G2?ksf$a8d`{q2Q!R3fA4aziscHYXH`ht~5p>lY`dq;ZH z`JbH5->vi+pIqY%Uf$yhPsaO2+!I;67XxOf{Q3HR62H8eOiCMD0tP)zf1sc|f19^O zL9ss1zGF4zRmutx<}OEr@#FP{hT8&DFkaQ+jw>UQdKb((Pb7_} ztIs8-WApW~#Q1zu-ZgcZL8iQ)Z*3j`(rY|VEZt7vnzy?&dKo!6u5uj#mL}vHHArF= zos&GrHmaVhTw4jx{gSX?&7EDH=@y5DV^{39Pq!+(vF(<2 zq9v@fuxlVA!c<>%Uy1{Jrk_1 z^Ll0!I|AR{+}GrEOcwS8+$rpInzg#E-07C6e7V;x6Q^R4a69I6-EFf+U=J)Mql)1Fi zy{MB~HQ;s6ks5bntr=E>q+LtQSi6uDavRK2b*5JqeM0>slrsJ$`T-f!u@tgeta9GUkmq7{+COI{-H?+EO zowL0o=M8mrLS)e?$e|;r6sJ3F;B>E^9E)q*6(Ru>Y`v4+imH;@ScJ138$%*s5b0R& zUb4Z6veYu-`MA0&w;CeW@##`npO1d#IIoit{heXaVXfZCGV?oFJURR5na5y zrMoKwXB-{ScqcJZG-leIF~z=u$#y0`ksZ3|#V8Xj4Oh2#B45Yrfk2SSx`DvxaIZ`4 zkey~%1S^NK`I-jVo~FqOOI^8>$@3~!-QL;S<<)J5y^A;NFI&*5nD;Qa`<%ww^%A#6 z-iApK1_DsV!apFv5yhI;w|Z=i^xmI9&eIwmADM>u(Z-%We`6xv{YdiwHLR<(2YBF& zs;FUAx5I&g=XWf>p(O(w$(%R{Uk2p#E$Y40?ewZO`Wmb4?#)P8M2qrG5p_Gg6{3hJ zBO>ksfvnn_U?O<$be8;;ir|e^r(srY^mi=zRB&&XGrP!Ecq0amo8S?9#3u3}h!ME; zR9Sg+1(o-lyMo$bhjMsB-q?uAvfS0Mym1s8<|zpdDY=j2Ei|ny?M`5pH^8>G#%Fn< zF)r2Vovr08f8xt!!O>zVZ+yiRn5fI$DQT+ROpCp4bvO6($sj-K%-2Ox!K`Dk@Ok|- z?3Hmwq->94`b95D>CeL=SjF;h0W;P%tVxFFnW!r7caeyw@`}JD#0#QWJIqmzHWu0b zBowut`rYj|?0;d^p&3fH+d)jU+n>JVlfA)cEC776KYfX^?)s(sTt^4Wva8h0q;e>t zYNEf~Q+38j$Cd?VKUuxkEvK;a9a)?aZ?Oj3f5YYSa!(X&9@vPZNrH*+w5pL9~rz|hr$fpLZ* zv(pn9HXXPMv{BAb&$j&2h&w$+N8L7el88)~6`|=ehwnCbha=ByI3in}gFif9mf{}i z`1yOg+ZVo92g`vXaeKp_etV0vnLd)^NJ1pXImH&qanxBP$I$|j97n%Ia-4CN%jt-1 zbw_NgJ7Qbi5!>pH*jBsSVIpmdYjtxbuGP(%xK=l3;#%FDiEDMUdm5PA*6d!O8p-im zZNo=iqiu%QW}D$P*=BexwizDGHp7z*o8dJ#H^#QR!;>v39u3a(*!SJw3^KOwd%cX@ z^9J0}$2L%Ub$d4~mw0V8op3iG@+seqPGB>a;WRv#;Q+-Mo8qe46j#+IuPQSoo8CCt zya}PTvB{}2=Y2G~OD>$XuB*opmuQwFFwrchU(u|%X27$Y#z&ow0e69)l_-RgAqvpm z>Kvrz!Q+J@5q)*wZEz9w2J&=T@MS8gL$J3KUR0x#;Dt0TI&oVH-u`8-G=*&V3wHaP ztSXZQ`*!tTxJ}pO)tNj}?y4QWnL8{^{&t;@H%97|?dCza+18|(`f*dSNinsWtNfwO z+f6-qOQNP3F!kW=f+oe(V{Vy;QUj(Qye81ln0oNqdP*rzrSPWi4mu06Zan;n#}V+G z$*#y{uLeB3vnIWY(&?oUT#S2Ao~p@ZW3lvVQ>>2CvC(~8jJr^t>d$4{65A<>?%Bte zlHk$j9l0b!Rf)ZT#WlDa2Dgzb2x6)X+(6vi)!PY=U*8RXuWM<=PG#ELR^xAoYiD}k z)!`KJRIrs%HR|ds@tsRhm&RaSS6h1;O2htBEkEUTDf|kzeQWZ%DyRg64;W3i$7I?8 zMSYJ9gutO$^f$x{fB`+Nl{| z7S)4kJ($*mX+4;>0ZXlJ!oQky%~i0^61Y*B!nap-ci~l%Mx(kRAwGPuZTAh*eBvDM zuqsDbckbS?cfh~@ne*vBAYhKOHo)4yu{OMbVbp2k@^CiwEtNvvZn&ZyKG$tRDOlaK zZY})U0Kd%C1LLK=)7hY%o3NZR~|8?MkGr$!Cy=4dg{q5aX%IkMN4`($$4yQH02LFEqe}4vke;lsgp;a`9V&nBY z6X4S^#*w~*Y$m5&949B zG+y6t#? zsbX~#P8b`S+Rc2}w$bI75mfImB6knw^~y@`FoCJBrQ5BK$E$b0F>3;p4!4-qAA!4T z%~-@c{(3Tvomsc2!2_1`^6U<1b9XMY?0eUev05gx%zc_sD%mt{2w%O~%{HQ@v)xQv zmM#(YhpAnc(An#~dvUp8VB)#=;xf2sx4F-KiyE_m?*94-+~$R6VpHmnDu;W%>eLct z|L#}&QXf0;*}c0`f0_CmoG%|to!5VT&$`rtO&zJO)c8&JrS5{XU8xzHzIy+j6y6oq zo7$ObO5K?{n%a~q1Y00O%lu>EeHRy~7gPTP>gogZ`CRJnQ}2a;?}I15nED~4+grrW z2h}xJB}k2xz(#=yY8HG>gnP9MAr3enK8>8Y=k{4TY1n!OS9HL~83$C-gDP4wzy9(b zD#oSvRFUgF)<}lAzsMUM(QNNBGqx}3nj!BZG?{&d(y(Ub3XfF~?rsd;Phr)KEXa3v z`Rm$-r|#8dIg8W--n7BHx{QmsSC{27ys6!28vivkT*eK)(IO+b80GE}#0YyJGhb`{V+fH3`KJsbnbrAP>+kcAl=S!W zM>F$q1zwo#B4o@2-1beUg=BtoRjMirLF;86tOsFti&WV&YnWo90bs%r9e)qOdI zsJ1p=$+~>cT<#&5!@kPBVNX0W&nT~|+LrH`+w(osUqy{HXa|+V{Q*JMQ&qJi-*b0* znPx^sX@OHmjik_c(Pw&c z6UodsG1U2o*rO%$wbs2ELv*FQKVJXTxz}RIk~{L049&iFN~!ZVwM4p-Z;q?;H={&L z=Hp65zJB_9Orq81>!+{yG13iN+F(;tW$sU0P%x?0xj%6o!KBvmwjQ(RHn6uKviC<5 zh4%i4ovCr#du*@?+8NrSBkC|)Y&@&iM%thbL*k8Nehl2c7TiQ@{ZrU565MJm-{kI!V;|I)ge`(N&AZ>GWf@Zv>0}QnO zd^)Z_pBn3TpBe2=e?EQFpHHRq=Tj;D`BX}OKCRK8&%W*Vhc}Ha+FYo|A^oYxA^oYx zA^oYxA^lm)Ji}cr{>Ja9)z|M!WJKs_dss;5#D=8U9p>Ue{-)`ie(Lw-&PE2ZupQNR zmUBh7xdI?}8Tor_b43SybJ=8qlj&VdjDj_01_g{hwBx=zn&HhDjo|fNOkQ6BTtPQV zVNCi15Qj!DAKb(oG2XTI&D6804}qZ^S3uPMUAR#GgL#PIoff&;b5|F})t&b&N`>dU z8Z)r8_2Bh8VCm8w@rE_Q8QwGe@m>lm4Uk=)I#5TZ3qdToLy|BhK;eFypvI54Wu1Nsm&H_g{ON9E7^&_7#Ue0g>ZhLloJ4B@d3p zF-fXp$*yeItykE)&G8D-Y8dr+q~mX4l;P_dzYPCzc#eWJGIC1;H@NZ^F}w*Yys}{D z9=HoDOkkpMc=?kzLOBnnEh$kPU5X1(rgJTY;DbxyLT~n~1)x_jT%#D#J~!B3(N|s* zhUq<{C8)MQnA&9lQO8ObhLOC+3{$$y&ck3Ar5skoN*B7w;`y&fx+=^jn>ZkVXRJFa zhowO=4B>ND)Dxo{rPiw)mTs)Xonry5cWQ!o;;?jMWsGi2%DQ57<5$K@hMBFOLDov? zr9GGVq<6`9DZREp9Mb~S!c+2(b0}k__nL81dMjU#^b&D?-N@2g zl}~!lNVR`#RG#AM8jw`OlJlwMNcB0d2 zd9@LA@Wwn7>wKRyBI$mKNpN=7s~k(9sQct)L2@JOKDlcVP}BQJ*h9o_KaI2xht!C> zPrBZhFN!MX+F_wlJ1jKnhJ{Amu+XR*78-P%Ct$csWb0zlh$2xpEF|iNg~ak< zA+dZ|NGu-~63d4r7t4o*#PVSwu{;KeYlYVA9~Kh*!$P8eSV;5_3yJ<=A<;i9B>H2J zkXm!wu#ng`EF`uK3yE#RLSoynkk~dXB(}vMA;;tPVIi@7SV(Li782Wsg~aw4BqSfV z#~_gy7u6=)W03f~aJ2?vkdRM|qq=)obsd*fF{nCEj6+q{6@zM(q>4fHl`&Dg24YZk z+7*N97e!q=Vo<$dSX9YjQB9RpF{t7zd2*qz9WkhWLsG?{`b9|4fH zD~?}keU~!_>X9M+IFFMqn_DyNunAJ;<;b@kU&|H%Yc)a2YqpChiY5%I7&QafypAZ1>TjCC-!1;QM0n@!ZQ9KoHh(a-@=50fLcu^hn{ z?1@@qIkMhaZm4}d93kRZj=&~2>(^)LZCtKfkCA@k_=gD^3d|M|ogG~VYbYqRW$`qK zTXjRhSep&Yq^VQ|@=C6xH581pBydCBnX4!dRlyz5Z$|T>|=x4oDa!roM$o4f@IPLFmFMO2#96tiyx zcPOn6WZT_UE!jM|a1B=8-11Pak?=J=jox(#h8u8mnUq{I#WXj%v(R9;Ucy7tZgz5S zcjxUv9qz^LjJ~%$$+D%Z+iAxXmhSNQRa1b;@Xj~fF^TVY>uPQ>f8u-9=uf?U*Zhg8 zg45-JaT^f^ID@#l5$@0MyKi@uHLdmb_~f#@-9fo5XVcPGpr^F|rlV=Cx3@o+<(>7; zWqI4^b6L(MRj3v1v%G!hxh(IjwE(UPy6vF?iXj(gO;rW=4oH&V<^d)FFz977c^*V0 z`P)Jy`P)Jy!L|VJJK(^$>VhM#s)JjGIv>wJg<7VM>f!Y(SZz}Z{vh&dn^JC5@Wvye z!K-bErq-rZj@CJn$?SHU@4y$mlgCmyL%w{p=!JI(KN*C*lF9532hFQAp?> z4Ua@fMRh7L%|&!8Z0ZlR6{;YK#qDFr387kZnQ(1qd?p+ih|h%g+{R|YYXJRByJrnD zy?tr6u}!ssg0HE688sQNj)qRaJy@_Y?I?8khvzHxQxLOP+e=(O<{Ds>UuXtM@> zZ-Cz)gx{Zn-~W7(QolrDNhq}nt|7V=_5A6b159*jQU#S_>l)7z!QV&91zbpf`L0z{mf;N;Wm4I!zb1zZq zfu%}4H48Riy+x@Dpw5G^TM)P6yjrf*ccHyoE0yYmc744{sh42VJXizyaF5atYL)s6 zP`VAvm0C6dp1DG)lhDroRWOvGogcak>YbugNj>xx+WT;WQnx^RFKz;o!{Q0)cc{GP1izSp`BkD1b#z12lhigwDZ^3K|bL6==DmqK|7}( z1Pq{^du{}*pq-z18$2J{dGTR*Ht@gc?MnR&+WUL(`)X+K+?$m82K;^ses_X^U3>)S z;P)Q*T>}012l)LU{B9fqd4u0K!|!tF*Wsf|Ed-hT=rN^sK>z05tkgGwAAkD}z!dt| z`%bWLpntdC3VnnAJ$4(&6!h=EM zvjE>4J`FMr&%fm*s2iR?{$;=no6q-Q=mRnRiNH^ zO@Z3`3|xxyX9emw7}GQ0F0g9`3e~KKp$A_sR0IE4sNTO|l=_{nQR*FsN2yny8Ku7d znNi?e7Lxe}6rgwTZ@g;)H^mjHU%%(4f6=k6yS|Uo7g73R`g{ka90wZvGp`U3Qd0_U zhMdoi2DBA+=N6)VCw+FPu>jr{_*V`t#xnRUS5@%4g8pOL7H~N>!mBaTaEzh~+=!H| zJo39>^!eT2QDtK;eC_6O1>k5tKC!B309t*X+E|FKUjmL*0hNyw`VIXFkVD=2f2hjy zySL899wea;`_y)I5PGsh4XPW|0r;JSZ~N3<_og_3#gl$`rUydtKH1KjIOH zK&rGau2%u+CLx5GD*w+jY7R&n>NosX2%39Ifu3t#skgri)OyG%QbS}4EA>iI8+PA`CU@@0kAbv}ybu58fRgmCHxz-WvH12W`~WqLoaKhhCEB_wx5~pm$%Hcm;pQ zx4o+|m+^Nza&~;w<@|jDZ0|}=S;gNcLRj_qs2n{8!=m()Vb(o9IY&PQwq!-=&x6_Q zcww&oVwjDS#X0)(VUCW{<2_Q*`Y%)$s;v`p^iv_!7Nx%k=H}yt_1xZz;RNC<5&CHm zl#9|Q;O41ld#0=DqQ5iL3_)L_N<@2Rs+pp{m#9kw{Vcf6D%$=_)upNd+GF{hR7pWU zTg?{jnFI0^?QbcBGo$UFtL6&&d1{{8IzETbe7Hd?O20rY5cFkm*l_E_9Q{JIP|z<@ zi{N{XUyIdZQU4OSJuF)PQnggnzYHv(t&?)~zeT-8&|^q8$}hB>UXIXLfDIL`zfx6- z`m4a!h}K^XwpEnAM%4)VT2(9Lp$_gpi_$Mw%LV-k2>ZSg!E>crDd<>k6zFoDem&fMl*Qhmueyv&y^tti1POVd~MD#-k1k|JTcdAZNe;0(@lMy_- zRX614^vM))of3Ht3|dq?%v0L(Q} z`W;}6N9*6Ib_)7k3Ow}Dx%OY9t`YRR)owxmR`pi(N~FJg)E+^<7p(qhd#**xaC`$y zl3=hFg2xCy=+7wyIjX3z82^O7FQK&K1^r1(!!NnC_F_y!gZEnSx{&^O!KG9dr{7%K z0!l;QESI*L($KukrM-pHz(MoUAhO`4q2K40McdI$Lr>OC1CQNH1Mk^On;b|(tlat_ zGU25mf-W6+;*qp9)L)1WMA9^V;GuhI=+EZr({$+Hx@izy@Y1FQ(jfZa(LtodOM~cy zmj;m(FAbs>UfLyrG>C3^bP$0NY5xn>4E}6XpMp>QtpG+mL^;g2LiqNF{B0C`n+*b{ zDM!P%B!3$NngOCBCT}e0h0pM}aiA4SnX(9U!podD9y9{h`I7nyq)h;Qa22GupIf~Y zpT_Yw{`Slbn@vLj+Rf)i>1^tGT6?b!mbt#o=J`~{IFb+izvM!`1-?KbGV z(eUlVFwph4F<^gfH%Q_=p&7N6zm0>r<`01K55Y!6dm1HWW&_H`oQCnH`~BttV9Xv&~gO*4gPrW%^_3{5f6^fS%*L{n^NE-*9~0?jt2nMyQ84Jend z)?Z|3E(V%~Of!vWl&L3SXr=?rBBq%^G_TfUzh12`F*GxQW--%TqU%wbW){fSX+Y#s zpqUA2`95dm&5bL2cBN!(T4GS6gP#w-P)0DmHJf?}Q62c}qmYg=f?m&Tpwuz~OR(_G zjzqXQ0BmF{BY2=ct5yRtC_kgX+v#K(83i&j7ixhpFZ`biGJ<1p6wsAI`aJJ*zL(I1U&O(!32!Fk3kRAhgECkAi2E-3m zd*GWLjp$o0Qa2iG@wMFR8R;>AbeH-B)Pkc3-_pATYJmj<_`lL1JqBuA4Cza~&t+bU zPvfVY%Tn^`8fmmB%G4(fqGK6R)O8EhrwpPf)j33wBRNEIZ&nUb^wo2SjwM7tZ4kv5 z)IYVJ)NM2+@}eqT>Xju!AImD4v4KAv#VVim{I_^)Z9!ID=?? z1Ip;D^?Jq_M~K4W0m<<=h;|_Amm3;AV~m3s2gosu1C;e~5aB?YRYap2^o%hM;u?$9 zA3?gNIiF}&n0oY#F%DuGi`D0tW-8GvZ&(H?cE%V7@r%Xk^Gq|1Xll)~^o%hMX3WLv zkC|o$(Nr56J!6c6nP9PcnfrAK(dhA+f;kFjjBzkygvV!8`rqhLhxU1y`YiMW^&3X8 zwT$445EiOGf^?iQiiC{7CZvdrz;!YpBVT}eP{-l@!Rw*-_FGhsVRS4v>Q)&&hOb)) z<8&^uIlE^?Ik^;kH$(uvn=tjMf)T-Gr(0s5kztB&B^Elf#?LG$54V%Mx`FZ zxb0$P_1J`<9-AQa*o2@Sn;`Vq1c=V!v!ouIAoSP-h{z(1)MFEb9-9DBSfr79Y=Y2Z z6TtFE8mY%72t76dtXrg!dThd*LXTmrpiKRVk&%fkBNItRzG!4*qL2}|eKR5>aEn|- zMkWdwnMg8X?Xihs)LA_?afFS!NrdQ^45E`5QM`q1q585x6faoIjXK;*owLW_=D-M| zxZ5f>GfWbC3~$EINuJeXlSUY#7^f;ze`*k&%!uO7iiPSc2GPj^QFu311kuR?(a8eQ z$wH4!4(hSVLXS-j>M>k%%GqO+gL-VT&|{N>dTg@LW0Qk=Y_iZ}lY@F}ve09bgL-VT z&|{N>dTjEWLXTnGvP^x|$jB6yktrl2e`aK4ijWbwIyoXEQ-q965i&AG=&>nc)LA_? zWrU47jQWaAuJ9Sh3J!#X&t* zEc94$P>pg&r#o>apTCg&xB-lr`!? z6T8OMlZ5&c_(U)B0+1LTyT(ZKblAtFz03#K7(W6CcAU*bI)AT>ui3 zQC|XD^tdo;(4k;YC`AV@0Exlab$x@5-|9#NUaV81zRWZ_cAX-c;)Y4!v3~*T!PvEo z@t$35_FR?<#es2UDxsbP>=5q@8Se`T?>~iH^y)7Zcwb0(e+BXo(+dgjukts<`_K3r z;{5=8!)VNf25%jAzub8B7ZTnQOWo3QiOtzPD}*Sn>m}4v22nharX_ePA^J7QMMS3x zM5hWwrwT;z2KyYMc<*?Jde9&`HHhfc5r!zPiYC<8;S*)_B1ZHgLiEoKq8AB7FCs+$ z0`gEsFCs+$lD|a}y@(Kf2=Y)yFS3Y&M#b2oUaPohgdvJ+$_e$fkg5WQF+T4xZwc!VK}EAk0-${;$85yhjZ)73W(qSFMT z(*&Z^1fsa}Fo)+pel52yeT7nIOFX25Lc_kPs5wU?ey( z!Xy~&sf7AlgXnZd6pv9)SKl#+P8WzyCq%6!Fr5&!mcVo&!P5!RYQP>5oo*17me+Jb z^a`fY5`4L_&h#44bdun|Gn|qx=v@QW64YxzxNo&YeUEAMu7PFdS$YjVlAX*|2EfI*82t-Q+q9uf=wKPkDh?a~nL{XO{)MDE2L(o;8SG!iZi% zi2k!d^b&#SB?8e)1frJ+L@yykt)+R1K-5~Amy9q(abH_PJ!cTbcXsPhKZ_9k7lY_5 zf#@uO=q!QgEP?1OLeyHCvkaor(ws$zT1#^l#ME%yNK13ph_N(rFKa^m7(P+UUdni1 zN_hVS(sACpRN#Fn;hh8?;oN>H;cYF=O9^jlXYX$k z*GWiA&@}_78Ir6SlB5~_4RTR4B!y;3l4h_TQ<5};^_Y@E6DLVCSdS@bG=ub*lB5}| z$CNahSb9uJ;V~tH9#c|yOi5VXK#eXvrljzgk`Tc}8tE}5g~ybHm;};Dk0}ZBRnB8d zg2j(C(qlsJC+9IG!9qeB=`kgR$CLz|kw$tg?!Bx@-oLu?Gmr3?W{;qm2S+T<1PS%Lv7P2H zqH_q*pBhBx2t?-yMCS-Z=LkgS5Te#&niE8H&Im&k=h1|E!5~`7h?WwfKQoAy3Pei@ zQR^|45~9{)Diw&95~9{)Dz%6TkEwKoA&OQ=LcQA{I+qchONjp5AUandI#(b%S0Fl9 zAUc;2wI0)4fvEME=8iB#(S}Q?-!+KNV?^f>qQ5YR&J&2v6Nt_eh|Uv;&Lc#v$289% zDm|uogsAnH<^?^bc_YSSLi;$OehHsAZ_Q`C=M&!lVepHFO*q|4R+6+d7Z9S>(p(URz2RYvml-$uU5 zgnX3=`6?6gg)h?1tzMRqd|6Ag%#K)LX_k$!5sQ9)LcPb#ISU!lg@ow;7(^EeL>CG~ z7Yald3PcwYqSn$}7({g82tyR3BnkCigXkhg6z`Cmu6}J0T_g})M2K2Ta}gnGEzLy& z(M5!)wKNx5M1`ffXoMk(F{XripFwmnBZ~L&VN6;3mx~3Wiv^;K1)_@uqKgSpYiTYP zh+0c?@d!f{BXkM%euL-|Msx`w`hNz|B?8eU0?{P`(Io=WC4{K8G?y4erKP!q5Ve-( zlAxuzWW-pS82wDB*WeQ^&83X@Qo27PK^%2}^TX(9&EcEX`#>OLLj9G?xV}&1J&U zTo$x6mkCRAS^kzBeD3Bu@eYgTqrv4Jn0id*{K-%>AfD}mE zLiG(u#|UQ%qz&yUeG5ejq%C(oAO+I4NZoBla|)zwJ?}nFfwXn0Z$d4&=LpshA}7aE zW*1iqS}~H&6yy3$nffb(XgMQVPKbWXAX+XEEfXU-t9^L zazfOefGvmdOS7V((Yv_HVf-#u-!_~nhw+Ov`ZOt?;<8KX$6+!u~7-8~VNr-;OAX>?Y zRuZCrXArFvh*kF2VPY?Z#>0M~=d)ZZIkRWYxsh*z%|UR4QR zRS8~I30_qRUR4pVzGpD53QB*~2$OzXO)pd5H;7g8}n-f3=YQ>Y(&jzp14kcR7@)9~fTMFt2KeS3fkosu8@Z z5xlAqys8nrsu9v(6O{g%5hne(N2E;sqd~Nm5v?Ue|H&X)D-f*}h}H^3YXzdULi%fi z(qAj2zcwiSwLBqf0V5u8BA9wAnRR@igj{9}s^abRh)xQGx zsCO`~06xO00Z2!ye+BRn&m`zGo-2Tl)73*<1D^4Omo< zNqCPpc&{{gYcFf1z-P&;C|(%@}(gX;5hD+%v6`c%T%@gaoh zDnfLEk>FK~DBdqVT}?EIt`dl@5{Rx6h~mA#8GJn!N#`m;6yBmph^`7Ex@v?Wiu>>q zbn7t6=w*!PWrXN?2GPp|qL&FoFB6F3&DI%JY!JOn$mnH3L@yg*h~h5BggPG(KtwNR zL@y^qFEEH+E)cz3AbPn#6z`(Xjrz+4qL&8|y?lfrihDp4>OzBPJtJCAh~n$CaNepH zh}H{4>jk2Cn|lt?dP4Lfs0Hd#O)84(SPsr6%Y;+$#OYirzckk*Ga`hA&-On_7zo(vOUag-E{_+!m8lI2~ z%`;kypWO^_cBR~T19!fEn0CHL_p!@e?f7j9?1#S>_PD>F|Kqznay#L1=X(Q4qPxSp zF_6|2NJ|IOngeMqB2DiYZxv~J$9P*HZM8^SL%X!wMVj8Fy(W;hHjuVXr0KSFh&0`n z&OlmMAgw!)c7;gOZO(`^-R5i{ttXJSK9IISr0IV2iZtDije)dHfwawmv?~K?TLNiU zi8P4if?Qo4Nb7Ub(0*=!w45evU`^OSny>`MI%>iOp$QvE6DDE&>Kf3Z?BZ{z31>n% zore}YzNr8;VM9<8HjpNq#WW#J*dR1v1B@c{1f(WxAWe8F*Avo&4WtQ^Orv+cOHJ57 zns7GLXiaEuJlC4Afi&S9rqP*}+@ z4WtR@F^%5&uC=9V&}W4kers2W8ijl{vV1j?d>sI(LHTMF^3^EhtC40}D_@ObrfsB| z*2-67P`(;TzOIEQp$s;HryrFay^7ID@-^RJ+-T&>&Z2szZ6x_xz%*LE<{Mt=nYNMS ztBh&1e9aXzZ6nFoLZ;F3HAl>}jU-=-m`2N2($Hx6Y9#qu%rsiQ^zHqx)@%7{B>B3Y z`>y57%CeTPMv|}HOrzz?-rhf##&ILb*9}ZFpD@(&{%ZXKLsJGb_7ZN-LZY$qzR1ul z2AZWzvxI1@1+mo7ECZTlO!F2^qh^65sfH9-2SB;>kD$aRyD>n0)BO(fU&mS~jOrl4FmkzC^otTm0RH}Q6> zrV$hQKwBq=cbf4|6W;iaZp1q+@Jah5N#HSHVZ_X1)|LY(WF_iZysTYqMf~3 z)sE3Jg%)<1`jLrow*tO;M?@>&yHNeJiE+0AzPTL{t$^=BzW=Tj@Li;;jf}PezU!5h z*jB)|3tkAWCAJmt#dY^NV*S1q@LjBa%rp~;CMnkMTR}rCRzG1Hy?$@^0qB{pm15lg z$~5{0>x8LC&wQ;E!pyf={X5g>8?1{>J=(Hrg_&=$dX;JP4c0}5 zM$de$p!pZ8pE8ZP!P?O1nXeUQzQyWiOp~O(zgmy`%+SZgQQrzP-(vN1rYR*Fy>9zz zy|%1cVde|3%)ZfUvgoaqsb4_raRzE*`NB70E>ypSbkvA#LcZEazUs%!)PP<`cJ0O^0ma!Xv?aNA ztBvH#%4r+KFi_rS3i)ay`Lc4_2K&2^#>%OduQrk|E2nMXxggC{Azy7IUsg`rl$I|m zr&_++NWQF`wka)NR!+5iwUK;TIco{)3nn}Qw!-R zsqJE>X{VW{4)Syj=wmMDZ|GyL;BV+-u7qzmcek6FMn>D(p%o>n+t{z|#s`qmwsx|W z>~6(&;{#ZmTT5y?`2efkJ(N>KqJ$He9U(80Wyq__5p0vPD^S#`2bm_(LR8U+ARPn zJOSvV4m@$W%f#LH|+u*0A)gA?fRc{-E@&5z@DYq|cry__NTSL;8bx_|qh$mml?k;PdV(^tmStou$w)h-ql~N-GP0IrBnjL=saPv) z;k80W){>08&F~Fwx*!>m8fq=c$RVb2y*d31T*p4lG@&TiT9T2sGfgN8ww7e%CZ^FE zYQE4=Ye`0qFpZWGec!^X^;$;Ol8g*7jg}D`$9b|2G8YzK2A7tTJFGO3L9ngx!%FfRn!5uptWNmhF zJ!UtuvADDr?I3Hjn`yK+V=XSNMLWpayn<=8wF!5dKwt2^VlSzW03ztkSc^+qLHW|( zXuknhR?1*yO6$5#=42;vG7IUb>pBf5^`4zh;-uAeo#Z#zh-|0eWG8X5#~{~fIH`Rq zd(x(pI2l6jTw-%}&ysxBBL&x`%G7#;Xcr^eMTou?#x^3_B@pcrh;|7?y9AgGK(t#R+D(Y=H9EK3AgcX4W%iYI z6QY|8>fJ`$SpQDjY~7@7_HaE~+gMGa&pvdMwz0B)b~1M^ONHbc*HhQ1&42~!aa>7F zs9%}5Lk4)G_xxpmH`CQzBkdXB4et3%HRv+YcM@mFR$2#?Ixo6+A_KhX;J2=2fH!C_ zSWivQ1Q}>WiTW=ScgO@+bTVX5&ojKq2yd>~ykQb{6+u1onMT`6dhRW5(EIi?WGkIp z3-vcQhvN!&LjAYlRhD^`C0<==#!*)ADhuN%_x|WC@oJ0VeHO-1MxBCMk#kw%l|4h0 zHN28`ZI*cTKZaM?py!<>Uj3SBv|Vd$O+9O8iC6#2G@4h|*3`3hmU#7lOr!1Eq_AtV zWY@mNG}^AUww<d<3(`dWa+IHHm&5~VP$TY_D z1{+w%AaS2dmh9Si+wSaS;p|F>&yI?dbh)4l~>@l2BK{m_f|eGiK`vv#ZUhTQ4wMFECqAnDv=aw_aej zeneu1`)O9It)|Dglcr2PXr!(e5Y*mAFCe&3^&13x0m0nbNiQI{P;KKH(A(I~-;fWd zpjOmdy?|hsvS*ij&HTU2cnNxr=>@u+x6y0ne;M2ErTKpVo`I3aUK871B)pAYn*Sez zCu#bh$Hg<45+S^Eo*mf^@8#|ds$F{Xytr`;Gk^COC0M|~ets!UfaQYi< zS>W!dGPMhOg(GDn^LZoj`5H(^?Xpquc_Z;T39^B_+z2Bj_qOVdWan8vZzMiHYp~yF z_^dIrYmgg>&mqjtB{paGEXiT*i{Rd}GPTWsGcIwHo9M^ZEj~8y^^NiM{L(8HiMP4Slz)idL=DI z_27z#t_N3Y_j8-|N}AQiI{LR6tfa;2I;PPpX;vHS=-*~qNjtzadL_+jV;%k5418X! z?&S7FSJDKz8r zs~OR&3DH{&qE`zqB9$|>$e*H4_PJ?J4BicuZ-f9r- z6NvT+MEeAyeFD)wfoPvWbOp`LGmY-=BSftn_Zcrp>+G54O>}*vPox~5om8F6QmzE! znV!4hN|L>WTMNHksL$w3QCkb2fKxn23+EP29W_OL8P4(GiJmFy{RK^hRRvY>*N-5j zs^E#j_tPn#486@_EATCMre__U$LJSn`i#c5K-%^|+CU&}M<8uyAZ=G5?V3Q^?m*gG zMVju%9+9TcxaiZp#5=thwSx97q+ znzxBGea`2QNYfY`4y3(Zr0M70B+~SAj|9?&0%=DBX~#sGwsN;Z+B)?+pdZjSL&+;s zx4}1@>H1lV^ph639nx{8>o;0N$Lsq^i`X;z{iH=62CG@uhp`m9a@$W@#KuzkjTW)i zyS5%2-N2c{g`J z&oxabmeT*Gi>078DN}bEK5t__ZzDe6W%#^J@Ohiy^EScfZDO|AMtruhlx<@EwXu|K zBW(UfU7U-hY-dEb6QXw;M7N9ice_AzyFhe1BZ{$0!CxttBp?pe{+E>$}I zgmYCcmNLMY4G?Dc7|aF)W&?!Ty^x3cWq>fdkH4X|IlrG8yQO(AZ_yi*At4R43M^YkZD4(lmXH<4>3(BmNG!v=3%A@#Zm@H+dRTFp;*cQ z#Zn$+nould09Kq9tH+oo6iXSPSjtJJ3B^(dD3Rn6|ilqzy#cxk6 z1#PA>^#rsSXTlvUn>$E0kHWlyGvN*)n>$E0FM~Xk%^f70PeKj)TXZJeLF4%;gU1dd zn=+QNgJkn*rV07yJ4iN9F-^!n-$AnZ4AX@C^Br$${~T@EGIbhyh`id#yxK{;I%asa zQ}Al1;MGpStDU5Kt<|zq&t?X{ok3phBwjtoG$CH?BwjtwG$CH?BwoG1G$CH?d{grZ zeT*{oZs;NMY8Ufr7xC)2;ngm|t6hRuy9BRx3100YURfV>m#{o+EM*t*Dm0g#-OP3_ zONC}p^w7%G?;1p}VMMPXL~k~TULz2_Mj(2PK=c}c=rx3>jip=@MD&^whA8^CW$HZ! z(cO&bZbI}O2GQLD(cJ>k-2&0w0@2+9(cK178B5tsh*~+`9gL;yCVe91_*}~3**z;H z!5BMOryc=Zai+wmL7BP_zM+QL!|3lJ^xq3y!I^iDL0|izdkFmxLP=c%uJhWNcMqZe z`kP%B!OdxAdb9@6F?Wtxx=x`(v+hnXg{p1+5z z!jCac$Oql?rt?8D5>%#67(VZ1KJO(y-)~0QUcu+Rg3o)!DBCOeyq8AV`#@TdKYNAV zvOehE5vI2=j#dWoMm=(_WkjzfL@yYlN6xiEZ(S=8y;dN4EhCCP=(U8X)Hl)5e0KWa zT$YNq*7~3rXDm|>7%3cN%mxXw4;XDTC@>o&%#u(Bwap-5_Ip67zeVl*LBh=Xpo2yV zr4KqtQfPh9!JrR1NZQ8wpo2!+$o2d|;e!sEld*C=e^B_KgC^o7*YgL34?1X0#>(~l zLE(cAnv=0|J%3R6po8XQtX$6@6h7#n3i+Ue!Ur8RCu8M${-E$d2hGV?xt>1=d|s?R z2z)|~FbMm?y z_onu1a2=vdec147Kl5ro@#+r@ul5UG?H9b-FLRE&F{vfaR6R)ffx?7SJw$%T_<>To#54Vf>+lO zudMBUov=Kt4|*N(Dm0g#%lYu^o)wx!adoXsJ!)pr1B~baLiA$>(E|d}0|L>#x(AVdd4g&hq zVfVD2c@F~m)8TLJgB}F*rz`7&9t8Afs1HG|t`E<`SReEtpx?oJ$`1nicxFVNg*gbV zDB%;V2LXMgv1gm~PP&7Deu=Wa<3Z5oNMmoA(`R80f;KNve*o!d^&A9kjx_eXjNavW z5VUy-oKm$k(X%kB;Ud$6i-E@avIoukuD24QS z-sgNT#i#L8&Sfe2biLw-J0w=CPXTf`DsXQEyg}CJxI=)iKDlv-blj&6zK4vC)A$}D z9cOPPIz&3ozQ^wn={Os=KSVliC)AFTf5_-K8Ro(OZe| zK2gm@y!C1#)9Cd-Jx{0xeb>t&;B#(mPwU?|TH_xk>H92TjidW8OW$FVzCVI=^sWvI z={qc>@34@*!z6uefCHj(n51uqLFKTKKFcM&*X1xt-{%as51Sd*-Y=!4?=VT<=b1)J zpFUfR?@ZIr!gr?qG1Hh;BO!f zss`d)hz9PON~lSIJo5D>;H#dyZ=$(-GNdD4ZxVC&O*D5~t#T91-S+K*HvwNW>YawK zH__aUwV=kh$;{pM4i5d^i<_Vo;W_T?=B9I5Dl`usAw>TKWCsyF!iXLrL>HO3;t_+W zJ|}d95KS7?jtE4L5Taj%`jB5o2+=PY$vk2Zm2U?UJcLN>)Jzb)3_nxNFH{Mhk8hzu<5zsYocQ4nY zZ@jTI`o^0h3U9nw$~5}Mn@WSBzVYS=-OIa-Y4nXZmF8Lc#+xGwZ@ihp?a?>hR2Z5X zBR_cK&3Q~yNBt@{G|LUm3ZN-wnw3P8GBm3U&1FFImyF@%L}RV;dPCCyG~ZwvyjMAA zl{XohG|+sLX_|?~-ap=AXj*~hd~OfkA_%sSY0qjy(+)HjFb&?Ih1NaZZTxEeT0^rA zXf9-$4x+KveW#)60-C8z(@iw?H2f8YCId7VF%6zrS73$e@zrB!)&tF7albYYjr9O} z4b4WNxtQzOL^Ss1rOk%sN}!p>G+T(q-n?{`p}87p5=_%aH1_7Dt%jx_Xr?pGHlneo z^S2wC0ic<|G&_jKp3dKCXm$Zj3DaCdH1>4uhe%8Q4S&OV=WqEN`i$R!Z#XiCf?9HjwB+A0 zO-M@)k(T@}(}c9-5NXN3XPS_f93n0G3e$wNRH>8!oDFxfFkd_>R zw=|Wge`cDHmK=h&HRy`m-R-ReeEUc=S&mQl0&dNwnY7cX+m0Z2=;1~s9!Qo zNJ|bW)RO)9MDJO*+-hu>*`4CFe?CufdLy*c(6 z$aSf*a(xV<2}rZZ&}g|n26A1htXv<1h%wTX85%9u$3U)2m6hvbAlFDU-_U5eJ_d4K zs;pcegM9=@Gq+(reBzylXw4i0xh_>!u8%>)7-{C1dbC_01G$Fyrs4lFh!`VH($HwR zJ_d4Ks;pcegV`TxW*QnT*T+DvOO=)DW55ZdNf;W-i8(-H<@y*t7igv$8ZFny6ho8TInn)& zNYnM*Cen0$w+GVh2&CN^NV_YLc6T7{orm=c7koH(0?PMVB@j%+U0%=bK(w+>YJrziM+DSugbR5!FtL30+@Eb~Ag}P+4 z*48(Jw$|~6n?YMws$UmqE97R-)|Ei1we`)Qtt*v{5#9{ix=Q^oQ0n@|stxM@_}e(R zZ}KfrJNgGVgSM`LTIMv=!l%{NH$y9`Rf=gQ5>3+3Xl;EnXzOZK&NNeq=GA&#kJi>V zgSM_#6-;wJ(I~L?@mYFj&CQ^#t0BFPK5Jj+=j$oe2yYQeEBtJxPyP4VermrOHNqOT z!f+0CK|;L-NaH+v3vfQ!3ipTC)O;vlqNWz@U%wRzi(~Z;1YFEc>^S z?5{EC-)3ZA$Kh`ivVR-NzD55w;XB<%vTsjk-)3ZA#^G-x*{?C^-)43t=oq^)_xs#N zvR}(I+ILz>u|&IKbsPCkbxflpOgf@d)Szw5+sJoX&NSM0N>TiCrrDKn8~IK}Mq+L= zyAo{7R@<1jk?%B~X`;T9egEQZ@7vAJ6^pmN4f%GG5sUY^#P#f+6egxM5L@w(;zGc`i#uTWj~^ zp#7atD~){L$%x)bh@NKhf#{tA(K`vzVyFdYmpg-q-Z{b$MehaP7!Q3$ zjd2$vdKV#jfkE^xf#_WV(YwT~a+lB;cZpf$E`z9zN@Rq@-RM;&)G8zWcQdcj(OCx3`vjsjMn>-&VTfWh4c_wxV-`pK2}bk; zA-WdQ5z!L@(G!HIjUt>NM6D-vLLhpA5VfAv34^Hgq)rf`cFsEy^rTLRIq!s-^Q0$r zLd9j!khJgF0At=`(C+LJo* zrtqXNx|&dFBO~{-jNDH$vd+lJ{X&o3FJ$C?k`e1k-7jS1ev%REN!@Q`M0!&9lZ;qT z>i(c7b-(bW?hkrW_m2Qi3gg-d)oi%&0CVF3;zozz#sh{M+LL-faN_~uhV`T#AZ}Ps z>H*@0^`ssUIuP%-d`W#pJut#_Ag&4|REt6MK}PgJLbTH$`k+AcL4oLl0?`Krq7M?H z){}ZLi0FeO3{hNDNvKwX=tGR?LxgCTLG&Sk=tBb0hs3P%kkA+piCN_#gQ)bR9ul+4 zLqSjKAu+2w6!fGX60^!fK~L(TH?=2)Yh4M|W_a~5^Xg&ZRkz{Q!-iMdlX{qVWj(2f ziC5N>dRR#R!^A7=Nj)s2-+EFHk1*-Sl|pzgszLM-M)VOv^a_LMBL-3JNj)MEeS{FT zp420R=qacbE!am0QR_)PA`rEn)FUGdQCw$DsCI+sqm1aIglNVf`lvwkQ9{&uQjZEm z9~JuKQ9{&uQjZ1^eRPB&imTKKwZq$K}!VtwZ{)Fl=h@NCbPZFY=4WcInq9+Ma>q(s?M6D-vQXqPg5VfAvNrR~L zq)rl|){{CJ^rTLTIqzi9lR7Epypuss>ZI_bP6j=xlfsia8T6!13Qy`}(33hTJgJjG zPwM2G!jr;1A2}I$oMq&3l94Noj65#%*yBP*9w!;Gp48()Mjj^_v7Xf9Mn<6VXu+LL;h;KsX%8`hJ07jeUS zQtu*eSWoI*LI+w;>RlsD2jX6(gj#QO;1i7K6NKnh2GJ)3qE84!pAd*XArO6n5VfAv z6G23u7-5LwPOpU8U=V$h5q**nz1kr9q(JmZf#{QBR(Vorj3>pc@}xmjdQwk{S>?%~ zC-tP5Rh|rbQcsFm<;kEY_2iq{lfoT%3Ds+O^%V2!DdJV1;nh=ySK5<$ig;x`si%ln z){}ZlNdHsBE9*%;C8XbaQcsOA=|@{Lp*9*spJqg#CPcRyM4vW@YESBEf#}nOsP&|t zCPYs`t>{TTO^8}g>S=+f^`xF2L5Sim=A&@c8}4F$KkQ1zoy+)tZsEQ3j+Xb+C%&yE ze+uq8MhxBEu+Ie2P6yKPeF$#Z=K^WZ2hv^$q`f?{sX*GN18IL4NP8)e_8BJ)$L=XeOQ^>{1K_&VDb@_9NHg?9I<8xt5}M%@X$Bh+ zI3+a0DKRgeBF$hU0;htS;nWDy42UR>-h|p@5PgObeTER-W)OWw%wEqBqBbJ%j6n1m zf#@@YsEr6bBM`L_foDb-qNw{4YP&)7G$VSN5Zz-CJuMJDO^Divz-dC%Mg&d^L{Af< zHX?A^ASxpQrwLIT5jY);2%HwS+v#9L;Iy#aP6s0br$t2IbTA@tT0{g+2O|QfMMU6q zFd}eTL@_m-tk7f63K@BpWW+`Uo)t3kEXjzC z2s~?KL`DRjB^j|1foFpefoDZT;MrhA;Moxn5kM;>$BpNh8_y9pt~K0v&TvCV1fCPz zc#gPXBLdG6H*7@UIpT(m2s|frpp6JTH^Ow_^MvRQBj3+6qR$heg9g#(1)|RjM4uOk zJ}(e`o)EPWf#-vWK0m?`MGH8gb{a%qU_@UaME4m)Ul54CAP{{)%qlMkjq!q*RbDWN z%80-VVpe$}7!i0u%qlMgBLXjoS>=UbMBs%tbwmI?lZ4u3c=c}P)w_vT`wg$&ZFr?4 z0`LC++B**@tBR#<_d!7rC5gBJfgy+ohAcVFkcW(L!JM<0bIv(m6ff6^nVfS5$vNko zlS5K5p#D|W)y=%v_xrs3-@?US=qg}p>ZIqb4%NGRAJNLK2z(=2xfOwLAp5@&t=x*h zH<0~qMc|v5Wk1(-k-1fg_VPq~3DJ9%XfGvdR|I+i(OyE-tqAlIqCM$Zc@Er5h`JSl zUO?2X2=s~>QLc(3bDI+F?TPjlqW3A$-axds5OtMQZy?$m`jg&5)KyZwgG77Bj3}=u zMCNuS+Q$>^BSi04qJ5y%_YtD5lIjCQ`vB2CLey1KeSoN|r252+D6hyw<^d(z*Awk4 zM4wcmeSv6SA?hlrzCzShQhkAFUm@x$slG}SE2+Lh)KyY_gOyZY81woDE2+LP=JgF$ zQhlM4>Km-2`a&huH&{vag-WV#u#)Nvl~mtgCDr$&sHAv>E;0{lj`Z_6(ob^aDb107 z(2wyT_rUjNOVBVi1NC8WFAqX13l4!LiAZBIuM8s1fm0l zs2f!VLXR;JMwNj|6f3ELFscj;R#F3DR2dkoqz1yMGB8+44LqqUDZXA3nMYNtL0+pt zqSbS%)gaZ%R#JmRD_2Pk60KY%H3+hQkZ9#9sX>tau96xQv+U=qO_6y_i4OKe2Mf{X zmFQq4YAdP1KyRB{ei=MEN>#Wd5y0hk2sIgyDm^TcF4iloT zk{YH&v631lL|r8{ELcemgE4Pdu#y@EW8Sb}B{d8xsbRrNY8X^f!-AF6FsP)41uLmx zP)Q97R#L-Gib{(24IIsp;XX%(OO9;S92pM%*l@^^;gTb+k{S*N3fC_ zE;-^Vso}v&YB*FTRa!&XuwK#dWihO4ATh#Ibv z8X;=9N@@i3fv%Do5wkv!_q#;q1MLGxdZHtR=yoMK5{Qljq9cLmNFX{=h`LH@WRU2{ zm=WdOLXr7UiH`C_M+wm#N^}$u9R);3!Kg9{dW=yps*F;iSV@h7QDs!Hk{Si0%BWx^ zH3~+RQNc=T)Ja`Q@h+~&e56{9_F9b=t#+zbqg5+gNsSh*TqQMHv~rcyXvqH2qLr(p zMnm?yN@{e>vY+?BMdo8AI>r+nBSd#8(J@NYR#Ibt=olgDDycC-v?o0)S5jkysH>#L z08v*-jfoji-a#0dPn76bPjsvh-K|8&0@1NT)KyYrf#_K1PsR#SS4oWx5*-^eqP+hy zGM_5Zah~WnA-YG2j)PV|PKdfnY8((92SmpSQCCTg1EQ{y8W%I7yn8h=J(cKqPjtKx z-K#{$1JUt9)KyaBg{Z5f#sksuLey1KsW0F~5)U?nvn29?xAP-CK3W1^^$ zscKAAHEbm{5!9F{YPd>jqNw32sfnV7tE47EALuHni81N}`7}w6YJ8gHe?Kw85&!8_ z37;mJM9Lg{iePfUHznZvHsG5Y@J$Q&rU!g80=}66->iUdcEC3$;F}xp%?tSE2Yd?x zzJ&qbqJVF4z_%peTN>~!3;31?d@BOJl>y(XfNyocwVG{HVlb~mqBt3&$5ttP0879T3XJDe-dL#3> z5}oXcP8Op3mFQ$3IvI#ghS||%82Ki{>}awQ#T9|cLe$NUCI?ppCd2G#a&SdpGR%%9 z2Ui3ppVTV?+^a_B3)O0h*J_GrbwIV6qFUJ%fhnSuTM?KdTDcX0DUkhBL@T!0@Hw~TM?KRGon13jLbJmbh;-xU5Ngm zM5hDM=|a@42uv5EZbe`^5S=bW-HO0;C5kHo(}k!T^QH$^1g687H$Au_FdfFc>A@9& z>98U&J-8w;9aaRU2Ui59!-~N4;EKR>SP_^WToIUlQmhDYb#XLDX80VLAvyA+=Ew}_ z$7Vo|%#a*$D*`hhM`lQlxD|mJnj^R(Fhg?0tq9Brt_aM46@eMS6@eKsSP|g5?x-3w zy&5w`jl-(OOjX0K2+RaEW{MhaMPR0=;Z_7@iW+W3U?%i|Zbe{b%=$pCiX+oY`@mVA z=qw@nlMXN`vy~`TQnO)HnH{X8X2Ym5J6K80hEZj9u#%d6Qdd&E))SdNs?{8?)g004 z7u9NxYGo^_Iii)Tq~?fLu9BJq**{0La+TB^$bMHz&52p|^GaD{`YO@6p6Fa5`l}M1 zt3+)jH5Z7^6{4<^nkz(m(z9|UHCKqbN@^|;b(PfIm=Wc5#>n(jqVqh_c|!Dv5}gM` z=Lu0)NzDVI^PoSOCq!K(H7`hXUd)K{Ds5!?E7AF$=zJmin-ZN5t$w}`b(Pe7AUYq2 z&KIJtl9~@hT_rU?W<+_7J2C^5=mJl4fe>v^zva98EC8Ylgs7{e76?&SNi6`P3xuev zq!uVqtfUqQQCCSV2v$-HV9Z+(tfUsen71HUNiBd%YC*7)S^$;Qf?y@J04k{k!AfcY zR8k9qmDGZhqLSik9!GOzq0fF(wqOOu!93;9p zW<>c)XJiH`(IuYf5+T}2i7o-6OMvJS7*&=)kFf+sl_g3PE2$+gsw@dsQcGY|SrV+I zmcXd8Bv?r;IjJitz5*SY!K&3#uhmk~>L04rQq{^ymwBSgglK0ax=e}MN@^JpT_!|bCACb5_N2#gCACb5x=Lyp z5OtN*vX~L&-4Br&szjH2qRWM77bUtJh%OhRu98{~M3+NN@``Wl3EF4-pXJlwGzg>mBC7C zB~(%?gO$`usH9c~E2))GNv#Z4QY)d7S{baQR-P1<6z{}3nj@=xj;xX#xlD6p74&1P zAV*e7j<`x{739b&$q`pctw4_xDkt`VYF zDA6@QbPW()14P#V(KSNURZ?q$MAyWODDS_F%t$4=))QSTM6Xn$Yk}xmAi5Stm9@}g ztc6i!trEpbYAuW^YlD^4S{PN<1}mwxFsiH#R#IzE>Pm|D#YSe7YPHU5wNA9UO0`<2 zTG>i!ooMAMsdb{2tEARJ_OBDITqU&*vfouw>tdGuysJ1eqm}4-PjtNyy;_N`SE9C( zS`S3m3sF}|trwy_>2X|1trw!Ml3EW$T_v?XW<+^Uc4WpV(G8yH1|fQl65RkqHwaNz zNo@e48=ybgAVggywIN7!LyU;>$&8Lw?a7S4`kfx36B>LnVBXWd?lv0>1qL-+_SdV8C}M;QKz{`yt@_ zG2lBK@ck6<{T%T967c;R@Er;Gehc`15BUB##>c(kM)E~wto95Web2B_dWLK1w|pgV zBaB`frDt#}0vn-c*a$ttM(G*cioizb8QhA%#u)VsOq5%1WX37cO`hl`A$pw>-2_B8 z2~oEqut|uz6@g7abdwNuD*~I8D6R->5~6NJU{i2KU=z&UHU(D%Ho@F&Q*cFK6RZeq z3a$ujf)#;H!4-i`up+Q2xFWC#Rs=Q$R|Gbl6e|MUn;*@Q%|1sqOO9NxIkFkXhH)1h#-0TSN`FBCti&a4P~^L=Cqhum$=+w<545W_=*fLLxI>`@pT9=vE2Li8pjx($eK1ESktRM`eS z#x@vLwkc6u5!eQ!%C_K&z&03Fwgp!Nw!x^fEx01E?WA52;JI~VCaPB3y;j>rtD9A; z?W&bs5!fzTxfOx!qLo__*bdphU9@s50^1?`-HO2Wm}Ng#CXtz>M0a?iJA~*hN_2-3 zwJQQUfane(>Q)4H2+^MOIG(ZX5Tb5HU}@sohXX?G9E_yP=ZW9jv5wLnXC4 zSV`?ZDJm&mV>+56dwh=UksRr&IkE@(u|1F@dn89(CA9}~WRK*CtEBd5j$kFVM{>kf zQhS1x)E=m$_5>@bJu#@Hcy;fn8hgDOdqs^qRE@o=hOMObf*N~84OdC+6*XKXwO7<| zmDFD716?JxH)eexuZ>1#s`i23d7|G5(L0sscR=(zAo?8;{SJtJCq!K(^<9wYcQGT% zE6b6YrbIJ6(M%zFmlDkcqM1N66GoLx=rJ;3RLNALSV?8VsFE41q%vVt$qZIfnJ}tk z1}mw|le&`P75~UgSFQGWt@eplcdJ(WR4ZFa?GvqBCACkqa+TCR$o_qzm8+!oLH4^! zYG2H#* z$BZanZHmlHC3?UUJs?EyRiX!g=m8<>DyaiN^Z@iH2ZX4rqz(j$9*7xHzE&5RSxWSv zCwfqb-ls$lLaRS0L|r9y5QrWGq6dYjtE3JBQCCSFj2ThB(ixfAO7xH?dPs=guS5?4 z(L+MiRZ@q9sH>z70ntN3)KyZ4lqgnGhlHrBqz(lusY5X49ST-bhhWS*6s)8UK_zu4 zSVFk?$o(9?%^59{REGAxFNK z9C4M@_mCssOOCio>U+%*tfan|9C4M@_rXf)d#I$o4^~p&$DoqpJqJhC_`$33gQ)SK zs_}!WVJoR0K#dIYH7RZ>4dALuHnA7a)A@{Wzj%+WsZM^E%eA^MOK z{Sk=%2tDpNSV3CHgD0`d@{ptE7GfqQ3&s zUxlcvq<#gWu9EsSW<+`aWn>m9(IcMd5h4175IhU)M}n2q5vZh& z1S_c{Cq*U2`*9<)SaakzpCi9Xjy$P3@*DJHzd?@tCOP6Nsox++ev=$=mDF#VBUnlC z2vXFzO6s>@CG{IrQojW&so!EyN%2nT$ShGce)nqpE^0ibYW%Kh*h=bmP~&$|!&Oqh ziyE$y`d!p;mDKOh2f9k?_n7s8e+bc~O7ss;^baBWv=aRTi2eaY{{W(Y0MS2$sH>#@ z2on7xMntoI&qtYTZ^<`#9M7o|K21VW{OL4FBH+sw@SPU$ogVOI5BPEfd}joFIRn02 z0pFPcU+#eKtbp(AfGMxIjlfq` ze1!wPA^~4f@YRvWo)5lO;wuKe=He?J@Rc~m$72rXUu2eP&tNF^3QILZU;9D-dPaK& zlQ@ljGRF3`CUH9bBT70q@Shl=4^_oMbA3k6rlHyue5~9`l#FQy!{qsb!IlkA*`fiIEOO$)n$gEJJ z**wu~Li9N$noWt?6@hF(G@B50D+1YsXis_^x2?&bVn&ol^vJAIqNjVJrwh>+l<4Wu z>Q5Jp6@k-%s9O;@J!V9CJ`|bNN;JDCnq7##s6?{^(d~1_C(e(FMGm{ zd9@{m$2{(ZvdfrPN5{qNiGngNR!J{TpY#0mb2X+A_2{lb&7L?qG)EloT*5MkVh@p*iAs=Oy0sy=#&qZnQqWvGYVeDx?NiCXrdIYMkNKI78HUS=Bg0)v&YFGeC_q zL=CqhaE7SiWjSy2i_AJDn$r`_DMVjUqB((RP9T~Sh~@;M zIfbZO5y%-NnlolZxhjs#dL^366U`+=Usa;HfM_ltnhQpiT+n0Wf>9-x62(d?7mO;o zf|XP*7*%owE2&&Cs^rp91uLmsCv_#os}+&ipjw^jwK`L@dQG)DQ?;^{)S04{tEA2p ztz0E_CS?DaqLr(p&V=lDmDHIr%YI(#iOfbNn%fi2Eks{eqPdl*t)y}T(cD7RRZ_Wy zXis_^&tY;4QCCUj2BNN#${jPJyiyjKO-l4EPxLGy`i2rc3y7X2L|r9y77#rP`jfMS zsH>#T3KBglW<+_NF*2K#=-Hm=*+TS9C3-fr`m=?otEA2bqGtoqvxTUuq|OGSu97-C zW<+_FHZm_M(LA1L9wGWR`FTYu4-m~GL|rA7M~J#gDi09NBSc*#l}CwUC6z~rx=Jcf zu#(CHV_u$MC6x!pygb25Di2grd4iQxoV{ zr1C)@=qjmvG3x{QYExuhRigPl(fmTRn-a|rMDqjD{6I865X~<{T_u%2NHl-Ui1M|% z$h@XR3wWXhgy_3Uv;Yt-07MJGs8RrWi~=yK6i}jANfm%mr9iNfDgdKOfnX(707jJp z!Ah#YNnJ_tHPpzwu3DYrwK_+%dQY`FN42t*)H$M+tEA2mtz0E_4rKp1qLr(p&VlTA zmDD*g%YMEB9hotH zMEUxCWZqPw=X#>&3eoqK=(#}jTp{WzsdItoxzL}SD@0u-b#9R8xiKTkyB{L+mJ%)G zi53!~|5Bobpw$-=qOOuE1Vjq~(LzGhRZ@k3sH>z3#f&KL9my~y=*kJNckr%}q)DNl z64`RlPYF{_{n_YWCCSfqRYZKtQPpbufQa~(^Sd%4;#=PD%7}<>XXE;Si1@bmyD}o; zTY;XXQhG)DbAOt>`VbM{RMSYW8bve$a!h%Ru~#1=8Ua&HV;_@8Vv-tTuTVua0;ZZK zJ|@4!l#v*tSEwQy0aHy=A5&0bQqn8YD;m8*6;WN4YD(#qrHJY(em}umh16pa(s^pDare{k|tf1EaH_cB1$$>C5wQP zML@|SpkxtHvWO_@>Z&5Dq|5$Xl>Ku}5m7Qk?)X0CiF{OuDDQr&W=d-xSd@rfBz<5} zB6^W&q+?7`B6<;JqwNEW648sy_4G*YMT-*A>ZS}mgZ(Lo>EipqqC~WVxj_4qqC~VN zJ&Q55$jYQ!qD6^l4f5Ce)1S5fVpFJn?QTXcinl|qpY-P$S58gExndX|Y#fY!n z`B#ki7B&}B6!$&Fh%fK_vwVvY-=jPKiV@!;#?3Q}QO0)ke2Wp^wkD~3ixFSm`G@N= z#fWcFQ_jcOoquIzN5TFy+xHZszNe@u?_=!FzcLzQ`<`M_Wu^KUy9=U}#uO0sizRsH zUj-jycR{4cE{OeUb{9l3>U)Zsiay5ff^e0g-33uh*6u3#7`qF??nK<5W_LjpleN3b zK1O#z==&+I?}v9mRPiw>!e@UP?^fKOR#Ib1QA|}IQ##9Tiv4M2sMWtu`dmOU?&^Nl zYv+IWHGAHH8kuVJ?s;r0?(?g-ppqp($r3>&OMsFkf=ZSEB}?ckKPp+`Bvg`5E!`cs- zGY)yowb^DTcvpK0WyG<&?n?%Ir2@Xv0bd#L*`4zjfY0unFAKiPveW&-fG-*Fl?(XF z2YjgkUxk3LV!&4^;Hw<)RSEd227J{5zKg(TPXJU0pFIIkBjBqU@YM?VY6pCE0=~Kd zU%h~@e!$lt;Ax zS`uc1C83Wm34MG?AX-w0rqNuJiIxPSZq>15%!qQ|7nuf1w3H`WN{BX8qNN~5OF@p7 zf*dUcL`y-AmI9(KM@z+wD32VGNmHVwJ<-xaG+l|7h8!&oIa(TWv@{Sc4LMpGh`Jmt z9W$al?q-;RR7-QOYDe5Nau}MemZhH(G{*nW|L2p(@u-|MjZ~Mi^f z@l3xg>B6g(wl^+Ix|H*kdRfw?y!l<i{W9&@7EX@y7 zO>_S|b`@)X8n0rxO0q1?4^vGM|2$b&EBB|_)ylFb-D)Mzw2tb0q1X9B()oImOLe|b zb+#4Vg`o3=p!0>G^M#^wc6t_Of1&EUKP~I3^o64HX+Fm4Y}dh9=Lu#yJ(6|Cb+8k; zmUVou6&tC^mlvY>e2mR+cZI~} zcX`S0{65Bx8?K$$aihHCcL5(`#|_s`?6^^0#*K4)OxCL(ZiT44j2j_^k>B6hzu`Nv z)dSbeNz;PHMDD3ly^^V-WI_7OJOfAtB~wAkR8TS%luQ*RGjzmF4Jw%`O1AVdp`I#L zlx*c=R7q`Pwx>#sK~Kf26-m=t)u`ars32;bt7=qGHSBz>0`ycBL=C#hhqST^phg8z zqm5FmplYP0yPk^MWd%{At&g#4)Yll>t}2Kc?R<9$=} zkakr}=UNr?s$!k=tn;x7(yog87&{-Ut?$RK>{pQaSP36fMCO^bG{&y%SD=;sRFmRk zib+gOjj=2H6=+v(swwGXQY5B^#@Lnp3W-t_Q_9DbmYC`qQ%0#@Kry9#Oj(J!NMkP4 zm?XuN@iFBjrkci-*O*j_xxmL%keI3(Q&D5MSMT6CSC*J6%CL&YRHc}UeM~ipvHfXE zy1h16AyJ)T3TYo#AyGqOD#&Y@^qTrSwJ4^ef1cVB<8~I*(U`gv)5*uwlNh(NpuWa5 zpqR4$b2XHhviiBwG$x&5{^6gek;J&Vps~g@p_o#-Hc=tbRAO9R&`e{RQ%q<7JS`-~ z?oimDmZ32%DW;2$X(cgs9+Z;aT4UN!%!U3vx0M(--n7%0_7uZcJ$N2mA<@A;kAAL; zHKrrQT;gA=lf=03<{uigyzas=-Dr&n7=yS*uI|EJ(K2AdTs9O zEBfB0qVz83Y41`IdY6jOyHu3kg*p{^pB15ZsVKe6W%|h~YVTrOJXhh|yHu3k<#Hcm zdzVT|$o4K36KB&WtEZp7qRvX~o`rnrws)y0y~`E;d2H|E)UdrvMd@9x^f7kSj-Yp` zD80*7KF0Pg_O-a$v+tSrrquWE$M!BZJMyL5-ld}SE?4{KvAs)9{am(psVKe6H9p4n zE^anrdzXsRyIkvIZ13V`M=z(j&96$5 zUnP8u%`dB!+Y?hs@+-y1gl2`6PSRN+U-?LylJwcQr>N|etSm~FB0tXxD}$1iLCMOX zWMxpYvMAY(R$aKCtgK4fEO+a5l|{)=|8{)&dLkbcY8!mrC~2;vmd!+~c%oH=Xrx4| z0MRNyw2BbDfu4tZr7A$QiV(eC`;96=qE%u>l&`ua&A(~1WujF*(W*kUBKbK-s{+xg zK(wk5ElTW}XjLFuRfyi8M5_W(Uc2O~zG}>f@-@q(xlwbpnkQOKh!)Wttp-G^3DKMA zG0dSjK+|E?xPZ}Bm<|90b_ogY+_{<}H78}2=->HNUP7@8mO zoinOQ|LuB@6WR8U@3lfb245|1WzMI02b1ON#F4pGwW&_p*gap>Nt?o^v}#kGwBbEp zwlb_v+R%AL{|vn6%k>}CNt>g4zN(WpMa^x>y*g>b`)%;NW_8l0sA-|xt0(N9oVv2# z#*MAjNt>dkfzFkxlQ#T3wRNwS9b2oDHbu?t{**#xnaypnm4B_W!pG?6vXx==M3SE8 zPX9dRY>ct{%gR%JUryPON-=m1`~TvKvaLUO{{ih9qIbzXYYm@kH6+(6lb?Im8k%eN zYC#RiwHnk96fqZ3B-5)Qxppn}$o41RUpV44%c+Lun&V{qff|x))s<5X%{9l#_5(E} z*J}6}n``!3|Nb=F57dxcbDWNk(20Ch==whI{D@2i`kbsrO|M2xQKJg^S&f>YMomzo zCa6&p)Tl`<|EL-@gKE?SHEIUcs0nJ+)RvEG)Qo`|yyqq|6;+K|UX5C!Mpad#7N}7R z)Tjk&)B-hXff}`fYSaQXY6aD(1!~j^s!=NjYVdBS$W&4_YI`+miyGBbjoP3_ZBU~& zs8Ji#s10h=4ysWb)TkX)qc*5fJE%tO7^uPf%p!9aja=MQ)$wZ75jD!F8g*0+J4dMl zYSa-m+#IEjsL_*V5IkVX>dK#h8!M!ldK^+1h!K{e`u8ufx|)Qf={ya$(dc&Zxp zy&CmJjryuaeNdx5s8Ju(s1It?2Q}&k)u<0@)DNmrAJnKHRHJ?j)ZpFEv^!MQXyDao zAZj#JH5z~#4M2?sphg2wqXDSVAgD$IP@_RmjRv4bgPVxR`^JCDo z4V-f{6g8;i)tJznqoJsAzkjXJoTH)4Iq0SIc|voJhBD`%?+4JB(43>8%sC$LuN9he zG?Y2V+5UM#bB=~G=g9A4LUWFWGUs^EzgB3@(NN|b=lbUf%{dy%oP$@lEa%Xiqv3xw z=iu`RM{_65=T4gB4$rN)vQC4RoCdj*1}!-aT5=k+4WNg!l|R2SL#TgvNoMwx+lTk(K4IioNta%wg!U@w(5s|FuaXYEN;>o^>CmgB2YZ!t=vC5#y-GUt zD(S&qCH*AtRagyf`H@LcH5z#}8i^VuRgFfVMk7$85vb7!)Mx~1GzzNG2-Ij4RHG57 z(I}`!qZp{ceQsn*sTz&F8jVGb(yB&dP@^%Z(HPWd3~Dq6H5v!iXbfsJ4yw@@)My-3 zqj3z>;L$EJ57Eqwd#Wa0jV7W-S)DsKQ8nz`xe2JzMAUF|=O&^?Pg0RvUK3KIsCiiD zeN9vioI5uWHRu5{r)#2W;M}>1s6kJoF`>D06H((4|5~BBa}$|6(WV(I${&7GUb-1$-exk7X2CNg&}eN^Tp?L5=31MsrZ3IjGSb)My@5 zqdBP2Jg7!gKMzJlvg!ccr{vx8mX#A3s9p4sL=w{XaQ=p05w_!)o1}~ zv`RHH=<)ZpqjGLO-S#^XkYS0lsrR66I#P&MqFBLmdP5H;MKBSX~aNh|J9s>S4n6m3_T;~PD`IVEhTsO6chKWEukg1gxqNfEx9GM zS8H^0wBud&wYp+IYQKPD=(Hhif4QjLoHClrj ztwD{}K{Z-~8m)tBv<5X=2i0gD12uR}mhPaZYP9icv=KGnXAMw_4-Z9t7SK{eXMKn-3EkIaX9jj*j(qphfs)Hz36Rm09X+KL+2(<6Ca z(N@%ObB?y6Mo&`F{*HH0KBZ%GTUDdF?CC9~=ib_i8c+KeyLURN`+n_y*0!R?Gd{-7 zIr2$NitcM~8v`}?Iz(hXQZ?FnHQI?9`8|d-9gzw)Og*;ST*ckZ$6>R zCvZB%Kn=d?8PSz#+cqxtYFsR8G}BT1VpSt0o%@!HMGf~IX%~wc?i|F$qJ}#Maj~e; zoSud2(2G?KcaK}!Q(Y`-wD2)j4SNp4-5u*L^;#1_jZoqiTg`RyvASHGGWKDw2`MY1L7*;`^1e=Df>+*C7gOjMb{6 zXvKFkw=q^LI}g~OX3w^F6s>Ce7`v{JQ}#K#JDGKqb%i=U#;z;4+_8I)JIcC3T_0oD z60z)qASrAVaQ6Xi&0)5yo1Cox8!$L2^U%8}Bhv5zStG5gc(=dwA{iE^a0 zY2ssw+2=7f#^y*T%8}CKzu|P-XcHuDxDKq?~m9yk@fzFofCY2#JBzPWxYRQXUdqP-{#VpGKSZ- z@P0gwpaU9by-QKguW=vO!jOk1nlWN|f_iCTV-qE05I>gxNk8Pl0ECe`%t zuVwF;QAcBJ#&o8PNj3lWG4_rb?!G?uL_=rFm{ilvzm~mYhP~I0JJHaYRx4A@2mX2N z9W&fLd+dpZ&a_&YYCiNa_I^C>o;~(NLuXp8Of?_*7<)e+ch4SsKc3FCTA6Cz_3y{t zkEe=!F22`?<;*95KlaaK@5fU?7@Bl@Kc3DBz8}vgKE~dUCn?Wk((V0tI?Mfd-t(_z z@5f{Bf8*}Q(>cNSLU@FCy@vu+%YfNs!0fVEGUL6iN%NU9yWBIo zT$p{X%q|CJmjkoQf!XE2?DAML*QbZzY3Yc9LOJ=;cK4}Iiv#UL`tA$xFWp*_%yBe5X4a}|vW>?3O8J|5!n%>$rukp;T z5oUdq*)_oI8enz}FuMkrT@yQIe8%W}Ib-zab3^Vdk^8$}qD;0j+47h-PP->j{h0sx zjM25k{^%Jadw%7*fRC>q9vjD35s&rV81QjDe{9^%0pBeF->m`PZ2{ly0bkdE?~Z`) z&VcW(fbZ^r@1B6~-hl7Efbaf*?}32t!GQ0ffbZde?~#D-(SYxo#$$;;v zfbZ#Je7wrQ`Ij_(we4T)+y1rE_9ttdaV@m{YoYC53vK^eX#3a3uI)23Zl6grSjU*_ zJhSVBSwHPBuLEY+0ki9X*>%9|x>z#f{)^UJG|#U0%&r$^1C-hI!0dWpc0Dk=9++Jp zOJ>}^)BI1F-QbzsAj}3Svm1cf4Z!RMV0HsAyCIg$c>JTbsmyNl%x)BBLzLN#!0bj~ zb|Wym5t!W=OJ+PjNSYzqpWWn{-6YJW=ooMlFuMtu-2}{T0%kYGk{QpRl4hvp+0CBW z&BAP$=Go1_>}FtgGcdaunB5#pW<0-4n&Haq7SHS!VKzdU-2%*R0cN)Vvs-}KEwNeNz#neJiE;^yG@u)Rc5yVv)hE( zD0&Rf@NNTUw*j-;V#$o_x1<@Z%x?G0ZWm@_v~AuF%x(u}w*#}=f!Xb`WXAPv(hSqK z+0`@aD$J&7o^=IgU4dCwVAd6wb&Vx6uK$x}tmfGrp4lD3Y@FuV9l-1kV0H&Ey91cr z5ld#gK0@QB=GmQ|*`2~{yfV8JnB6JN-1X`^f!UqF?9Ny+QIdw|(J!0et_GUN5xr1@5v-Rqg%E6k=UvwMNry};~VV0JGs zyEm51c>OwQrYW=gJhS_R*>q)gA27QQnB51=?gM7`#gZAX?ZL`+?d0!0i55GUMwXR6FSy@PKFbfH0e-%pL${4*;_VfY}4U?15M^>*(G5HNcP zm^~CrW_*1yY36C3J?xo1EX<}8OWqUsFfe-49tLI)$C4Ree@&YC%Ip!(>=9wM zK=bSoVD<qrz;FGJ6!5Ju1vxz4<6GdlZ;G8cSw; z{XS_HE3?Nuv&V$l5@q%nFnbJ`JqFAk17?rKk{R!BpfyJw10MIx9v5aymD%IK>~UcB zI52x0m^~g#X1xC+X_jf8J>i)>AP>?vUO6fk=#mdtp6 zRnn~1JbT(Rds>*SQD#pAv!{XC)4=R$VD@zEnDIVJI{Zj?U_W+e3y z958zhm^}x~o&#pj#gZBK?@6;!^Xz%g?0I3fNtrzl%$^5k&jYjPf!Xu1WX9uP(ri{{ zFL-7z2(vB9>;+)<0x)|4n7shZUWg?#o*yL5R%Q00XZE5n+osH31ZFP^Gq-N?A~1Uq zn7tTFW;}mNn(fN$CC}_7VYWk=y#&l&0%k7(vzLI`OR;3e^UI{!smxyX%w85|yOi0> z!0csU_A)Sg8JN8sOJ+R(PMY1y>=n=K6=AkVnY{wcUIAvW0JB$s*(o?kWq|9FP%w7{_Gsw@^XkG(muK}~yfZ1!n z?6p`j;I&gsCo8=XZD6L+o#Ol z0A_Chvp0a*8^G+1STf`Fk)+wLdG@Af_NFkKscrL3VD_dkbM@w%!0b(6_GT=Z@%mBH z98hL&d1h}3vsudQEnxN*FnbG_y#>tPiX}5%UrU;U%Is~=>}_E-TbaEL%-#lOZv(Tp zf!W)!WX9`{)yyRA&)y+s_U>ix5VMQS9A)+nG2?rl+dFH&L(DERu5G?U%&PnQl^ryQgWjDI3Syz9D!ETA%5)-B0DlzsBgWc$^W?jt>^cwbg z@<>cUjj?wa>_+#b>}r1WG5IAXpT^ib40cPLLotVaOhJjsDeos|`nmdf3Q^2YKIS}$ zG5S3A4ujq34uf3{@36P;r-;PtPqXjY-eIsC-C?k+=|!Ky#uT&9V{DAQCuKLf!(dnP z-}-O<G|80r#b&d>kZgxwDuW%&I&y;c82D>NRT|T=L-*V;` z@-yG=#FxLjt4cZ(?M{5l`8L>HdVbdiyZfHsMrOUsXLsVuckrwvcUN?6ushu4vpcmx zjwvrOM(?`aUG6OStG0{obnjq}v3HH!pJv-&cWQ&F=7^8UFEJ_dJnk-^-Kh@Fw!!Xlm(M?ZjJ?ZeDg9iw4R)8ieD|H+Xoh9?7+f47C;JbX102*WO@@bThy~}5JxyxrZA7k(G zxj)U`Db?QPv%B2o^E4l0@A7G1YkyjK%JtXiUGiN%-JJ>l?mG(dm9}c;bb7~}o9|O@ z+7b4B%FT;RcJgy>zE5b5jvc-gtfop5w@@D^FHM!-z9$q zq4awY{ldbu2hlHV&QSV2h(3QWz3mx#5dFfwXXrun>5j>&MGvCi(T~nOXnxbykIp@a zKHm+zlHLv6-T}S`(JyLp(kpT6=#j8@6|Vqy74Jdxi<(?M#@mA^^XW%=)_eh+~cYx>X${8j%eL~J`zM`Bob7|(o?dAjDr+*-Q`q#vn+sy~ir+)x_ z`UlddpXHy=-7S`9rXR#|HqTewX{WL>`_MD{P?()fB$(NU!0ba|mO_tV>K_WTZ-}n_ zDJ!!NW66wnB+yP}W%iM0_K`5lqs%@6W*+1HcUAKlq!cXWLg@O>WeeG%||8Ss4-@O>TdeG~BY3ix^le0>7Gz5!pq zfUkeRHz42}81M}W_yz}jLjt~`0pGBIZ+O5rBH$Yt@Qn)iMhARj0=}^U-?)Hpe84v$ z;G1}ikLMnoe{`}#+kQ{q_Ipa(FQ9F|C$#;Z()Qh**n2{M*%R7+&)BtnX2$I^Y0e=w zJZJvQGy6=K6;x)Q0khA5*=NA)Ghp^vESYitl{8B<&p!9eJ{M-^Dzndl+2_FQb71y4 zF#9}~%(#C~nnIdqUwCF;2(vB3lIx5wfY}$o>dI`x=;i4a~ldB{QC1(n&RC_Kj!ujWFAx%)S9;-vG03fY~>| z?3-9J^vPedjYdv!t6bI49`}23A2bI?N3?PntH{O8P_LCvr3uu z_RM+0Q^%!+7c^$})8 z{ZCo*tWPYNaebRKYm`}E&#bR7+ojC<0<*rrtS>O@3whQzmdv>RPnxyLtevXudgM|24yzTGaD$(_A0Z1 zz-*u}E2h2vK*+O!z-(YFneqA~oxW3MgFLfA!t6U`HVBvv0%n7N*&tvxD3;84eKu(} zDYLG=Zz-+KEbN$(1U^W<-4UQ!XEsEbWon)c0cJylnHx8U zKz}v_m<@>~GhW}P9r4O+sAo1*nC(+$LxI^)U^Wz(4FzUHW66xKf6$J2Wj4$+8z#&S zDzjn0Y?v@}_2w{P=IYI1z-(A7nep|Zq$xrD7GDn-?wJi2W+~dA4F_h!f!T0iHXN7@ zk0mp{ewH+cG|xtOW+Q}INo6(yn2mt8IRe_|2w*lMmdyD2V$zh-JR9kmjTC03mDxyO zHd2_Cq2KZ9&q!hB>VT2JY-B8%@%7iFxj>nX^2|mFv$D!;6fhel%-mdK6fheF%tpnM z8DF1HnhTZLXwPi4F#BG|fYHEgG_=jp&^AW{v(d3+#@FwYCaKKEcxGdSSvk$KF~Dq$ zFmu<@$3UKq0cK-j$&B|mBu#l`Hr6v6E6je>JR1wl#zLNrg*+Pz%*Mu&8Sno{np9;r z&NCY)%qnP}jRR)mgqfS4jT2^Wel`x6jf*8S-XD`RKj>Uzyk|CEm{n9}Hen3%BV zqujYBdkSKroR6yIW9<2;vU=9Yo>81gryx>IZ69OLN4Yag_I%VtIUiNW$Jp~x?#z-s zqd1XHL8O|xKE|GpN`doH6XkqVJs)GwN4c{`5#_=F`Xq(3oFl6E7ykWso;BjVpTqu- z?&>&+^5xjQpOXW=Dd4kr5&RZ>_AY``!B;}=A~-GJn;!7Z2>50Oe6s?+*#Y02fNyTV zH!t9uAMh;*_!b6yivqsI0pF50G&-l%H3|BwNz%tR)V4oK`zw2f zuuQr=FFQ&4D|d!4Yui7OZT$FNE9<+hXzY1eZoNr!SZ5lOJ<-WRG);+42BMRJ=wu)| z8Hi36qUlO>G7#lchWEv~MsYKA8&74XE3!5gI zlT(S{(X*LTiC|$*a4Hcj;t5VAf*n1YdfCinN1UBO_kX+U^Y#dxvMSHgqho=Fin_c(DQNDO^YQno>fGqndaGa&uqFd zYp%?u1GDLnXVW3irbC`hk0mpnbw%bE&9fPv*$iRULYd6~W;1}<3}7|`n9YbKGoF=3 z=2vAl(=(eX%rcbOOkg$>n9T%cGlAL6STf^Tdt_Q_+nnW@%@SseBbZ0}J&4xUi9ZP0h^+l$wGMnR>%@Jnp zl-V3$HV2r^0cLZ6*_>E1!8f$0<*cmY%VaH3(V%mk{PcWMCM{; zHqSGgC(KTxnJ-ta^MKhrU^Wk!%>!ohV#$nGRU&gl$Ibbk*?eJkx-y#&%;p2L`M_*G zFqf@(pWO%t0s}TMDuK! zXSPh3U8>BM0kdVmY#A_H2F#Ylk{MrBip*uoY`JH)T$o+1%$5VQ<-*LZIW8AwZq0Ey zFk2o=W_;BxGFK?G6`t7&VRof5TLH{g2s3weV1+PqR|i%AvlX#q##bdHLmylEvz4CN zN?~@DGFu7ERzjYwggjd*%-q`c%2+bvtG1EJrp#7(W~+qR)yixYFk2rY&9@j4a`;pv(>zRtuV`}wbNQ)wif!cwa}lfh5l@9ESd4Hk;vrI z{%oCRwoaJcsCl*yn5_e5>wwuhV74xn%y?H#WNy+tTkn~z7iMQ_o~;LF>xG%ydAnYi zxt+J`g;`JCiLgGF%y`#PWNubw8$7cO!YsEk+W^cq0J9CiYy&Xc5IbhPyRcA_?=0Cd z(J@gS?iP9UzLEd?zxd9Q8;SkV-Gz2H;HH3YbHKMH;M*GTZ43Ce2YfpMzMTQzu7GcM zz_%yh+Y3JXJN&wht;Cip7LF3EiX-+u7f9hL{cXPF)h_zr>3-cz6Th|De87B>2} zuu8e3Nv@&ZKp7EC*F1nGk4-`XDpfVd_6J`Dzjal*)C!B zkTTl^%ytPgH`mxD%-sBJmoRfD-gXHycj9dqop<2x{Yk?2{_LXj4n>VS@wO{rzxSss zeDBXL`Q9IQ;%ygIRs1|<;Cp{|$@l)a6K}f`_IrOyX^cJbwkyHk`{Pc$?Mf7s=SfK~ zPS3VK&3-H2E;{j6)VLFGyAtO~%>J}u5@S!i?V=NJ;ob7M7yW3=-@PB6Yp}>XtUB-Z zI`0;pA5oomgU-7_=iQ+5ZqRwR=KE{5(V|9(OYf+i<{f@8t82kN>)ikEOW&?k}<7+;qg6LIMV=8J4pPhW& z$5fV>D$1~m##E)4H+)PriE-cSX;1TICaP1+n?9z7#8lANs;SRYi(=mLF|{See)s48 zv^pA7mtx-bG4&+IosqAvF%2l@9Us$BV%+)nG>u88n1A}1MiS%Bzc<#HCKS`n$264~ z_nn>1G^RPlyz66HNX+^AxiU1SCB?kwV_Hc}qzqeYOdE>n?qk|YOhJ8~b{f;3V&3;L z9V8~7#$2p19VzBtKBkkz*zX73pY{)p=}a*_d`uUKacA}~(U?mq=HEW%GW$HneuwDg zbjqzfweTw_CUmwpbaIwgV3XzpdPd%5wa@oG`=syrko>%(d!P0__8TPkN#EmkzwDE~ z=MCBq$i2-z>3eurg8hm6o{#kX?$f@|<=-*wIlP1(mz1-?HSPnM8B~4ROufe`g}&z_WTEkKFwqOGw>PF zo)l@H&z%vqKk*sSFX@ro^B*AkJpZmQbL)I`ZrR50JpL;mW9RX;HOAh#;sDVvYCcni z4(L3-y2jX^|A5TnKld?q9$!UcY|no{=J8+n7(0(o$~-=we!KPona6+WW9&RWMW4s^ z{0C$n|CNs^BA+Xt#@L?!0QLMu&DTDrn8et*Z9aO%3FdPmQsOVv1Ali7z}Gnp_{Z_EJsP;#WdkFh!8 z^tU;3P;z8|kFh!8^e;;K_abJTBca;n&-LKnodtYlE5!_?&%;@8h_b-WOb$^Nlr)3L z&slJYvY;fjW!q05qAV!sdx}Fc%XV3C$j`F57dRxd?7>Rw5M@CbdKP0YAmi@<=Q|u6 zqAd9T{f>1v3+CtfJLljlXngENW$qJnt@qgfchVJLdky%B)A_pt%Vf)utzotTW<-vP zq(M4k(f^8>yymnPgoQ*gEfVyvGq(}Ugt;Jb0fpu>`%Dh{zXtuDV@~~d(h~Un588-M zE$!IlegB!$q+U35RTc7$BFjm}zt13}=@8xT!uqbIzYCB(K$e^A z4YISydXSw>#^d!lWP`}~6?rV=l`ek1N3Xl_I{Hg~=Ern<>D`x8-hA$zHtNeqf49Bu zhWqZm|L&U~NNM)S4L99kGd9umqwHUPn@FeMKQm!b_s2f6|2DV&@a>b;_{{dH|4tD& zMc@>HQv^;CI7Q$Tfl~xd5jaKQ6oFF&P7ydo;D4(Bvn`vq?4wFW^S%2os{bqeJb>%} zjbypVxc=w5KQGy(Wap9HL&kOgBV=5!KSRd#{wrjK$lf92bpT!u;2M84S=My`e$3mM z-4DFh>b?H&Ki>U4`q6Ox-nT?HQv^;CI7Q$T zfl~xd5jaKQ6oFF&P7#PF0j_$vEap0!ujSKbEZW#%%o${SU7l-w-r~XaHrMQ2I_Dwd zx}WRy{A7I1pX>aBWL$r9t;|$M$!;RMnd}y_Tgh%CyPd2n*&Sqe zlHEmiH`zU8_mbU5c0btzWDk-(MD{S*BV><~Jx2C8*%M?>l08NCG}$v`&yqby_B`1O zWG|AvMD{Y-D`c;dy+-yr*&AeUlD$RtHrYF5|0L^1_Ac3bWZlW$C;Jy!53+xgeL(gh z*+*m_lYK(=DOpdl&&WO}`-1FCvaiU#Ci{l07g=wzK4g8#`jPb~8$dRYY!KOCvLR$c z$%c^)CmTUFl57;&XtFV6W68#mjVGHxHj!)+*<`XQWZ#laC7VVzoooi#OtM*Iv&rU= z%_W;hHlJ((*+Q~KWQ)m`kS!%!Mz)-61=&inRb;El){w0wTSvB@Yy;UwvQ1>0$+nPf zCEG@}oool$PO@EOyUF&D?Irt;ER$>>*?zJEWCzI(k$q401KE#chsk~-`BfFgJ3bHH7 zt|Ggd>>9Fb$*v>2p6mv)8_8}WyP513vRlb+BfFifE7=`ncaq&jb~o8QWcQNYM|MBi z17r`9Jw)~}*&}3+l08QDIN1|qPm(=F_B7cuWY3a4NA^6~3uG^ny+rmh*(+qPlD$Uu zI@ud!Z<4)5_BPo&Wd9`VM)oe*dt}|o-Y5GPSr4**lYKz;A=yV{ACrAT_9d~q0og*bMP!S~ zmXIwaTSm5=Yz5g$vQ=cO$<~mqC0j?fo@@izMzY`k_~Vbw^!FCBtz_HCwv+83+eya1 z-%Wq-A=^v#9a$#XKC=B}{QKXIG4}n{|2oo0ayN|}DKzrkMStHXBL;U4f9=0Q)ML2U z%0>@K$;p4(zLoxJEJ{sMwm-o@tx&QLt1*rFOug`z~ z)dx14bee=_r;+{"condition"} = $condition; + $tmphash->{"name"} = $name; + $tmphash->{"offset"} = $address; + $tmphash->{"bitwidth"} = $bitwidth; + $tmphash->{"rw"} = $rw; + if ($rw eq "r") { + $tmphash->{"const"} = "const"; + } else { + $tmphash->{"const"} = ""; + } + + $tmphash->{"category"} = $category; + + if ($volatile eq "volatile") { + $tmphash->{"volatile"} = "v"; + } elsif ($volatile eq "permanent") { + $tmphash->{"volatile"} = ""; + } else { + die "ERROR: specify volatile/permanent in line $line_no\n"; + } + + @{$tmphash->{"option"}} = splice @fields, 0; + + $tmphash->{"mask_format"} = $mask_format; + $tmphash->{"line_no"} = $line_no; + return $tmphash; +} + + +# +# 配列へ要素を追加 +# 重複があれば線形リストとしてつなげる +# +sub push_fields { + my $hash = shift @_; + my $array_num; + my $tmp_hash; + + # 既に同じ名前のものが登録されている場合はハッシュテーブルへ線形リストとして追加 + if ( exists($index_name_hash{ $hash->{"name"} }) ) { + $array_num = $index_name_hash{ $hash->{"name"} }; # 対応する配列のインデックスを取得 + # (condition eq "")のものが線形リストの最後になるよう追加 + $tmp_hash = $hash_array[ $array_num ]; + if ( $tmp_hash->{"condition"} eq "") { + $hash->{"next"} = $tmp_hash; + $hash_array[ $array_num] = $hash; + return; + } + + while ( exists($tmp_hash->{"next"}) ) { + if ($tmp_hash->{"next"}->{"condition"} eq "") { + $hash->{"next"} = $tmp_hash->{"next"}; + $tmp_hash->{"next"} = $hash; + return; + } + $tmp_hash = $tmp_hash->{"next"}; + } + $tmp_hash->{"next"} = $hash; + } else { + $array_num = @hash_array; + $index_name_hash{ $hash->{"name"} } = $array_num; + push @hash_array, $hash; + } +} + + +# +# カテゴリ情報収集 +# +sub collect_category { + my %cat_hash; + my $hash; + foreach $hash (@hash_array) { + $cat_hash{$hash->{"category"}} = 1; + } + return (keys %cat_hash); +} + +# +# 条件のマージ +# +sub merge_condition { + my $cond1 = shift @_; + my $cond2 = shift @_; + my $name = shift @_; + + my $merged_cond; + + if ( $cond1 eq "" || $cond2 eq "") { + $merged_cond = ""; + return $merged_cond; + } + + if ( "$cond1" eq "!$cond2" || "!$cond1" eq "$cond2" ) { + $merge_cond = ""; + } else { + $merged_cond = "$cond1 || $cond2"; + } + + return $merged_cond; +} + + + +# +# レジスタのオフセット定義取得 +# +sub cull_register_offset_def { + my $hash = shift @_; + + my $offset_name; + my @tmp_hash; + my @def_array = (); + my $i, $k; + + $i = 0; + while ( 1 ) { + + { + $offset_name = "REG_$hash->{'name'}_OFFSET"; + $hash->{"offset_def"} = $offset_name; + $hash->{"address_def"} = "REG_$hash->{'name'}_ADDR"; + # この変数の定義は後で使用するので残しておく + $hash->{"valname_def"} = "REG_$hash->{'category'}_$hash->{'name'}"; + $hash->{"valname_def_new"} = "reg_$hash->{'category'}_$hash->{'name'}"; + } + + $tmp_hash[$i]->{"condition"} = $hash->{"condition"}; + $tmp_hash[$i]->{"name"} = $hash->{"name"}; + $tmp_hash[$i]->{"offset_def"} = $hash->{"offset_def"}; + $tmp_hash[$i]->{"offset"} = $hash->{"offset"}; + $tmp_hash[$i]->{"address_def"} = $hash->{"address_def"}; + $tmp_hash[$i]->{"valname_def"} = $hash->{"valname_def"}; + $tmp_hash[$i]->{"valname_def_new"} = $hash->{"valname_def_new"}; + + my $val = "(*($hash->{'const'} REGType$hash->{'bitwidth'}$hash->{'volatile'} *) $hash->{'address_def'})"; + + $tmp_hash[$i]->{"reg_type"} = $val; + + my $find_flg = 0; + + #reg_typeとoffsetが同じならconditionをマージ + foreach $k (@def_array) { + + if ( $k->{'condition'} eq "" ) { + # 条件無しのフィールドは最後に来るはずで、先に既に存在する場合は条件設定がおかしい + print STDERR "WARNING: illegal condition in \'$k->{'name'}\'\n"; + } + + if ( ($k->{"reg_type"} eq $tmp_hash[$i]->{"reg_type"}) && ($k->{"offset"} eq $tmp_hash[$i]->{"offset"}) ) + { + $k->{'condition'} = merge_condition( $k->{'condition'}, $tmp_hash[$i]->{'condition'}, $k->{'name'} ); + $find_flg = 1; + last; + } + } + if ($find_flg == 0) { + push @def_array, $tmp_hash[$i]; + $i++; + } + + # リストにまだ残っているなら次を処理 + if (exists($hash->{"next"})) { + $hash = $hash->{"next"}; + } else { + last; + } + } + + return @def_array; +} + + +# +# アウトプット +# +sub output { + my $output_filename = shift @_; + my $category = shift @_; + + # 出力ファイルのオープン + + open OUT, ">$output_filename" or die "ERROR: Cannot create file \'$output_filename\'\n"; + my $handle = OUT; +# my $handle = STDOUT; + + my $include_guard = $output_filename; + $include_guard =~ s/[.\/]/_/g; + $include_guard = uc($include_guard). "_"; + + # + # 出力 + # + print $handle < +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Definition of Register offsets, addresses and variables. + */ + + +ENDDOC + my $hash, $tmp_hash; + + foreach $hash (@hash_array) { + next if ($hash->{"category"} ne $category); + + print $handle "/* $hash->{'name'} */\n\n"; + + my @reg_array = cull_register_offset_def($hash); # 重複した項目を最適化 + my $nest_state = 0; + + foreach $tmp_hash (@reg_array) + { + if ($tmp_hash->{"condition"} ne "") { + if ($nest_state == 0) { + $nest_state = 1; + printf $handle "#if %s\n\n", $tmp_hash->{'condition'}; + } elsif ($nest_state == 1) { + printf $handle "\n#elif %s\n\n", $tmp_hash->{'condition'}; + } + } elsif ($nest_state == 1) { + printf $handle "\n#else\n\n"; + } + + printf $handle "#define %-50s %s\n", $tmp_hash->{'offset_def'}, $tmp_hash->{'offset'}; + printf $handle "#define %-50s %s\n", $tmp_hash->{"address_def"}, "(HW_REG_BASE + $tmp_hash->{'offset_def'})"; + printf $handle "#define %-50s %s\n", $tmp_hash->{"valname_def_new"}, $tmp_hash->{"reg_type"}; + + if ($nest_state == 1) { + if ( $tmp_hash->{"condition"} ne "" ) { + printf $handle "// endif %s\n", $tmp_hash->{"condition"}; + } else { + printf $handle "// endif else\n"; + } + } + } + + if ($nest_state == 1) { + printf $handle "#endif\n"; + } + printf $handle "\n"; + + } + + print $handle <{"category"} ne $category); + + $nest_state = 0; + + printf $handle "\n"; + print $handle "/* $hash->{'name'} */\n"; + + while ( 1 ) { + if ($hash->{"condition"} ne "") { + if ($nest_state == 0) { + $nest_state = 1; + printf $handle "#if %s\n", $hash->{'condition'}; + } elsif ($nest_state == 1) { + printf $handle "#elif %s\n", $hash->{'condition'}; + } + } elsif ($nest_state == 1) { + printf $handle "#else\n"; + } + + my $no = $hash->{"line_no"}; + + my @array = @{$hash->{"option"}}; + + my $field_macro_func = "#define $hash->{'valname_def'}_FIELD("; + my $field_macro_flag = 0; + my $field_macro_body = " (u$hash->{'bitwidth'})( \\\n"; + + my $fieldname, $fieldshift, $fieldsize; + while($fieldname = shift @array) { + my $shift_macro; + die "ERROR: Field option not good in line $no\n" if (!defined($fieldshift = shift @array)); + die "ERROR: Field option not good in line $no\n" if (!defined($fieldsize = shift @array)); + + print $handle "\n"; + + # REG_XXX_XXXXX_SHIFTの出力 + { + my $name = "$hash->{'valname_def'}_" . $fieldname . "_SHIFT"; + check_macro_duplicate($name, $hash->{'condition'}, $no); + $shift_macro = $name; + printf $handle "#define %-50s %s\n", $name, $fieldshift; + } + + # REG_XXX_XXXXX_SIZEの出力 + { + my $name = "$hash->{'valname_def'}_" . $fieldname . "_SIZE"; + check_macro_duplicate($name, $hash->{'condition'}, $no); + printf $handle "#define %-50s %s\n", $name, $fieldsize; + } + + # REG_XXX_XXXXX_MASKの出力 + { + my $width = $hash->{"bitwidth"}; + my $mask_val = 1 << $fieldshift; + my $tmp = $mask_val; + my $i; + for ($i = 0; $i < $fieldsize - 1; $i++) { + $mask_val = $mask_val << 1; + $mask_val = $mask_val + $tmp; + } + my $name = "$hash->{'valname_def'}_" . $fieldname . "_MASK"; + check_macro_duplicate($name, $hash->{'condition'}, $no); + printf $handle "#define %-50s $hash->{'mask_format'}\n", $name, $mask_val; + } + + # REG_XXX_XXXXX_FIELDの定義の一行分を作成 + my $fn = lc($fieldname); + if ($field_macro_flag == 1) { + $field_macro_func = $field_macro_func . ", " . $fn; + $field_macro_body = $field_macro_body . " | \\\n" . " ((u32)($fn) << $shift_macro)"; + } else { + $field_macro_func = $field_macro_func . " " . $fn; + $field_macro_body = $field_macro_body . " ((u32)($fn) << $shift_macro)"; + $field_macro_flag = 1; + } + } + + if ($field_macro_flag == 1) { + # REG_XXX_XXXXX_FIELDの出力 + $field_macro_func .= " ) \\\n"; + $field_macro_func .= $field_macro_body; + print $handle "\n#ifndef SDK_ASM\n"; + print $handle $field_macro_func, ")\n"; + print $handle "#endif\n\n" + + } + + if ($nest_state == 1) { + if ( $hash->{"condition"} ne "") { + printf $handle "// endif %s\n", $hash->{"condition"}; + } else { + printf $handle "// endif else\n"; + } + if ( !exists($hash->{"next"})) { + printf $handle "#endif \n\n"; + } + } + + # リストにまだ残っているなら次を表示 + if (exists($hash->{'next'})) { + $hash = $hash->{'next'}; + } else { + last; + } + } + } + + print $handle <) { + $line_no++; + $line =~ s/\"//g; + $line =~ s/\#.*//; + next if ($line =~ /^[\s,]*$/); + + @fields = preprocess($line); + push_fields( analyze(@fields) ); + } + verbose("$line_no lines read\n"); + + my @categories = collect_category(); + my $category; + my @headerfile_array = (); + + + foreach $category (@categories) { + my $output_filename = $filename; + if (($output_filename =~ s/\.csv/\.h/) == 0) { + $output_filename .= ".h"; + } + $output_filename =~ s/\.h/_$category.h/; + + push @headerfile_array, $output_filename; + + verbose("Output filename is $output_filename\n"); + output($output_filename, $category); + } + + my $master_filename = $filename; + if (($master_filename =~ s/\.csv/\.h/) == 0) { + $master_filename .= ".h"; + } + + open MASTER, ">$master_filename" or die "ERROR: Cannot create file \'$master_filename$'\n"; + + my $include_guard = $master_filename; + $include_guard =~ s/[.\/]/_/g; + $include_guard = uc($include_guard). "_"; + + print MASTER <\n" + } + + print MASTER <e{!03Ci`fdFF*fdCV*z}PqtBfxQ7 z-!{ID;{)R(&DEr74(F)jG-;ZoNt3ooleTH;n3{ zkUl?1bf2cr%hUzx&j0HfmH}92!=eN2^H+`&E#qU!&FBJT$XL zCqND^RBFzaIi*WVOH(W1k1b2-&sn1{0bP-ZqCsV3ryOtmDGVQql78ZPw^g zRitJ~3a1t#t5u6sg;ISeUjpLOu){k*nSm6=_gGeSPksHEOXck37`U@^fWQZgY;um zSxoxanDnAxdQt3iv3*IUes#WTfM05KBgx4a_*19DtdoR4M=x^HExnswpc;VOr@zkB z@6x|5CVg5=`nZ_-@uBeJwX?Vw+Mo2(&o74l2GR?P8?eV-J=ew1zbz(xT1@)5nEDj} z9eS?Ce{l@{Zo0+aO}F^F=@x%C-Qw@2Tl}5$ZzK5dGulc2l`2rkF%M6o4$xbEx%F6n zx#^Z)Zo1`{n{N5#rdxiw>6Tw^y5*OX{-PNd%IX2^XHuyb4PU%;!xt~z@Wo3veDTr^ zU)=P^49;%)iv}Mr-QeS;8+^QUgO8VP@Nv^wP8>b(qLFi#{#WWckRKS24$i+)H|lh! z9;Wxw_Y)(0Iec5Vejo?7`Et8IMxR)Ex1E;WNq^DMd;RT?(R=+d`lSE5hGYmITaWYH zU)g$`^cM}i*Pdd7!?GCtvPYi_tn= ze*=cUYR0c8Z^h$OvLPT3=Z|X$ruWCB-x!nrwwUy3G3htP$iujC4MBZ-T}(Y->j&v= z`r_n+g`-vR@iDLA@AHor(eDe6kEP!i9v?-&ryd_izb`sIntrR}ihf^weEe%$3km_= zTh&Ze@g>B0s@lD;@4${-yRW}t$AP}R@M~F5@4CCyXmthr`)olG{8wu0?gI5|H6!_> z$x3xXaAT|*4Wg)e)0KT)tp(sBjaAiH8~u#2nYDc#v3Zs8c};e_0wx%oM^WcfG{f7s7dA1u(<@vf%ohLJ$uVgw@()JOa>9vRRs^jzEiLvG2 zfnFZ>F_otqO;vd^)A>rKLnXN%DZf3OR~4TJPxSg>%fSP^Jln@~ZLk}vqiJnlQx%M& z)S;?W)pGcQQmSoAzfGyJDcfvHtxef(Qqn1#GGJ56ZORUtQejhe+LTI@QjNv&>1o@Z zYAjAEwmsEYoKkFis2bt?MhV2^ScvCI<_Isa1%& zyRkD&y#mEVb-I{sYz|W@7mS{cOqg;#KqJ7&bocai#~?Sx?HUrVYl-Qa+lb}E z<_J>e<;WzbA+|uck1j`ude|Hx>KKl=LbrU_99bUA5#?}Xc|MMKT{{CuCJ1JirwmKR z1qR9aK51T_tcT!qRFbH2ED^_)5P2+DTvT-JF>F!F?PngoxTJX)Bh^58Dj#Q_o8tB_ zFKezXaN1EmeAXaogf%`he|NIe7Fz;YeOtU=PetZ8tuwk5)>@uZ5#htC=!A1-SuV_D-v63ZHQ z@+hy&#~QzXd0FG>;Hu%X21)a>=H*e2nAj4-WDSwWvgX*Zk#UHm}zS7Y01c1In>bH(U{GE z^&Yj{aSEbGLS}PIw#Utdb(Ws4p2l?`6o#<3E7J_$T*A@1nvSk!r*W{Ht+Up)Y>Fw= zv_9)(O|pfuE#8w1MjIN}wKvC9*pY2n=VqB!Krh{#3A%kXtP!6I(i*9P}Tll^&N&>$5HCu1@bshV!lM z8DCIMUg}W!_LOW!!a|bmZubOtsxtjL;4p6{OJH}qtZ!z1<`i4z_(LIK2U~jGT0eIx zKhYK5nYK!Qpd@T#ni|(PXBvAP;V!n>&F$IlY)_*%n9QhX?{qo|fnlYx=}e>k)nsI& zbl=XM*YCJN0)oCKadZ2=!GYa3?A|vh^LN_j5B6W{i~(-`_Wm1o?AmwWuq;^sJ8GzA zJA&S_f5(Aq`v-RnI!(C2YR>Dg*}c=rgS8f2Nh#SZ1pDuwhRJ!vStT7o`b07_@20O z&Wvt%2EbI?MPGpxTlE$+5qLJpW*n`bQ+)2o;hg5!GTvyL8U?z-8B_v}@_^i%QG;le z2gEcY7v&*IjOL#~uF6Al6&VJVRe5BjJRk==_2VF_^dv0Wvw$2#pPWyI&@Yt@6Jxs~ zKWG(a0IlK-pjDg!v}%vvk%3ilCeW%q$RnVk_wIH)0$O!Gz|muL%SNiM%nw@S89=K% z189|J0IkO3cLcP`Gl5p?K_2Z{0JPC+3@&_@s?VgJOMTZV&DK+Cw!KS2R&3{Zu<_h+ z{n@={&^SiVxY%=W1>4=!yd` z+aAa>EJP1P0>iFIH)h&Q%szCM$b9o5D2k4%ehClfWm;R;J2nyL^|X54a}g|C(&KQTuj}ax z3A6zz>>QL?frSbX3TMQYS;^~mXRWBxbM2Ff7TgRVm+Eu+Qy%A0^w@`anz_feGTe!e zr;P8KX>s&GkF@}s+cSMxXBJ`MqD)7($V^9?WoBCPQizuK&;pAMqTQEuo;oTbBbAQk zWvkhPhetEjnejBTjqBkP{Xme&b@0o@1gWeubXhWC8uqPBqkT{YoLVJ9ejL&aq0%*7 zUMw&-xl}ogVV*##_yG&9isTlI4l{zhxd61i&hn=M){vPNFD%JE9doe;Dyo1p6m3*L2OzPLEZ>HW2e}BT^R}ZXilIrScZ13#uqkyW%w}e#*-LA1V)$y15In(q!D=>w zeIJ|I7LNBt#jxM8|5&m+((ZK3wQ5|;oxVj&dZRiwIQt!glm{o_#!42rrEJgxX3z3Xt;={jkt)bjX1;AMx3$E z5$Q2e(Q!n&z;?!+c6c!f#;c=>7*5D?`V-A^S`p21k#c8SUb8a;%&RzN938M6 zcg3W``a`Kh73KX-H`t_tr@?gA=RM7+R4VJRkRwV|wmffH7xqY5RPugVV>5T8Av;iY zG`qqtZM_Lt^ObW_l-=9ogd9pa9s@2S8w2s;O+PxJCjwdXRJ(}NvazG311v<>2WI1} z#kcENcw5pfajoj;c9kucf-Hw|k$zUByg_6FyxdYJ_*r57)!yFnzKX#C*-`cnF}M8s z8)9=)dCR6kWm#WTxWi(ro$SKX#5k*?J6)~DhGD0x)FL^KP8*Y}%~5Hb)6woAp36zc z^gRs>rFX6Idj?AT#hrIA~_D%BRLM& zv!jjY=y5%l<8qy)%j0@3C*#Ni=XA6?W>+pJ9hcMI>V<9X_KsHXIYx*YovAls7y3dJ z$@GP&$;PtRND;!48&1IE)S!Ou&EVuj}*L9(kZMiO;oR@7@iW#tw}3 zNdAqo`o=XRN99+@k*H>+8>nH=q`PswYX-A^b5#MWL@%7jV=%qi5xy+!Q8v@|pQrvE zVmf~S;i)gC{uTcEv4hbCR$;Wbx)@t)D*0&Y1*pIc49(1$xm9jg+1y^;wa!tlTr9h~ zz12Z|rq$PQhGTt)BXJ2hM5Px1@URu0BQYCxCFdBhth?Y<07rQI3Wi&{+Aj^;d1Fd@ zIn`0HoZ&i?S2nm~&hWrPKarMu>+0RUX^kNI?v^Sm9O($0sk(9 zZZV7-KVH6Jn~^$H?FxOhRSk3+&GuyVca*=$H`rG&6iZ zkot$zw^E;lPYE?|2!ndljotALhD>kQwz5J?nXO%!4p)U{N1FvZqR6y#xA+t$+)fnj z&S2slHk8}7-q95dCuDp3#-puE^_{78DOjJ#-?~&^zShCPV!w4PlGQ0^bn(77jXP>G z$(Sv6@^K%^!E^6Q?spYad=XrQmN)qtI1VZgPAWq?ww`qr$f&Gp25miv_TFY*| z-tf$hUZs-B9E!2K2Q`ZRzO}3kp<%Bat>8Sp+-2C0 zu`$z8+Zr$cj4gxN8EbP(y-j_M>2ymr>z)bWoi(tN zF)bfF$ttYQ_MS{vQ(w!**urQMx`mB>x-Q-9)oZevJ&3q7Fk^Y8%uHxn1J+$^bF$DG zw>c4ZyCas@dUT!>m?ljgBeYk4pUf3V`kd(u~|uH*TH=c z@fAa6e8q4uBfeskK3BJ}3*tJBJYROTwmRMkw-hU^aAsg$;5s02V=?dQcKXIxcXc}* zi*8&_xhwlGq>RGrZLDElv^X5sB=g7QJfmI$NwxLaV8VZ+{#Oa$} zxHu#}uQpF!O`g2!Jb8fwWRX!+wcTZ{?I2uL6WdU@#U(y3fOh18?tTfj0DIy3kN8US z^d7EF@yeM=rMI!KrLno$G2?ksf$a8d`{q2Q!R3fA4aziscHYXH`ht~5p>lY`dq;ZH z`JbH5->vi+pIqY%Uf$yhPsaO2+!I;67XxOf{Q3HR62H8eOiCMD0tP)zf1sc|f19^O zL9ss1zGF4zRmutx<}OEr@#FP{hT8&DFkaQ+jw>UQdKb((Pb7_} ztIs8-WApW~#Q1zu-ZgcZL8iQ)Z*3j`(rY|VEZt7vnzy?&dKo!6u5uj#mL}vHHArF= zos&GrHmaVhTw4jx{gSX?&7EDH=@y5DV^{39Pq!+(vF(<2 zq9v@fuxlVA!c<>%Uy1{Jrk_1 z^Ll0!I|AR{+}GrEOcwS8+$rpInzg#E-07C6e7V;x6Q^R4a69I6-EFf+U=J)Mql)1Fi zy{MB~HQ;s6ks5bntr=E>q+LtQSi6uDavRK2b*5JqeM0>slrsJ$`T-f!u@tgeta9GUkmq7{+COI{-H?+EO zowL0o=M8mrLS)e?$e|;r6sJ3F;B>E^9E)q*6(Ru>Y`v4+imH;@ScJ138$%*s5b0R& zUb4Z6veYu-`MA0&w;CeW@##`npO1d#IIoit{heXaVXfZCGV?oFJURR5na5y zrMoKwXB-{ScqcJZG-leIF~z=u$#y0`ksZ3|#V8Xj4Oh2#B45Yrfk2SSx`DvxaIZ`4 zkey~%1S^NK`I-jVo~FqOOI^8>$@3~!-QL;S<<)J5y^A;NFI&*5nD;Qa`<%ww^%A#6 z-iApK1_DsV!apFv5yhI;w|Z=i^xmI9&eIwmADM>u(Z-%We`6xv{YdiwHLR<(2YBF& zs;FUAx5I&g=XWf>p(O(w$(%R{Uk2p#E$Y40?ewZO`Wmb4?#)P8M2qrG5p_Gg6{3hJ zBO>ksfvnn_U?O<$be8;;ir|e^r(srY^mi=zRB&&XGrP!Ecq0amo8S?9#3u3}h!ME; zR9Sg+1(o-lyMo$bhjMsB-q?uAvfS0Mym1s8<|zpdDY=j2Ei|ny?M`5pH^8>G#%Fn< zF)r2Vovr08f8xt!!O>zVZ+yiRn5fI$DQT+ROpCp4bvO6($sj-K%-2Ox!K`Dk@Ok|- z?3Hmwq->94`b95D>CeL=SjF;h0W;P%tVxFFnW!r7caeyw@`}JD#0#QWJIqmzHWu0b zBowut`rYj|?0;d^p&3fH+d)jU+n>JVlfA)cEC776KYfX^?)s(sTt^4Wva8h0q;e>t zYNEf~Q+38j$Cd?VKUuxkEvK;a9a)?aZ?Oj3f5YYSa!(X&9@vPZNrH*+w5pL9~rz|hr$fpLZ* zv(pn9HXXPMv{BAb&$j&2h&w$+N8L7el88)~6`|=ehwnCbha=ByI3in}gFif9mf{}i z`1yOg+ZVo92g`vXaeKp_etV0vnLd)^NJ1pXImH&qanxBP$I$|j97n%Ia-4CN%jt-1 zbw_NgJ7Qbi5!>pH*jBsSVIpmdYjtxbuGP(%xK=l3;#%FDiEDMUdm5PA*6d!O8p-im zZNo=iqiu%QW}D$P*=BexwizDGHp7z*o8dJ#H^#QR!;>v39u3a(*!SJw3^KOwd%cX@ z^9J0}$2L%Ub$d4~mw0V8op3iG@+seqPGB>a;WRv#;Q+-Mo8qe46j#+IuPQSoo8CCt zya}PTvB{}2=Y2G~OD>$XuB*opmuQwFFwrchU(u|%X27$Y#z&ow0e69)l_-RgAqvpm z>Kvrz!Q+J@5q)*wZEz9w2J&=T@MS8gL$J3KUR0x#;Dt0TI&oVH-u`8-G=*&V3wHaP ztSXZQ`*!tTxJ}pO)tNj}?y4QWnL8{^{&t;@H%97|?dCza+18|(`f*dSNinsWtNfwO z+f6-qOQNP3F!kW=f+oe(V{Vy;QUj(Qye81ln0oNqdP*rzrSPWi4mu06Zan;n#}V+G z$*#y{uLeB3vnIWY(&?oUT#S2Ao~p@ZW3lvVQ>>2CvC(~8jJr^t>d$4{65A<>?%Bte zlHk$j9l0b!Rf)ZT#WlDa2Dgzb2x6)X+(6vi)!PY=U*8RXuWM<=PG#ELR^xAoYiD}k z)!`KJRIrs%HR|ds@tsRhm&RaSS6h1;O2htBEkEUTDf|kzeQWZ%DyRg64;W3i$7I?8 zMSYJ9gutO$^f$x{fB`+Nl{| z7S)4kJ($*mX+4;>0ZXlJ!oQky%~i0^61Y*B!nap-ci~l%Mx(kRAwGPuZTAh*eBvDM zuqsDbckbS?cfh~@ne*vBAYhKOHo)4yu{OMbVbp2k@^CiwEtNvvZn&ZyKG$tRDOlaK zZY})U0Kd%C1LLK=)7hY%o3NZR~|8?MkGr$!Cy=4dg{q5aX%IkMN4`($$4yQH02LFEqe}4vke;lsgp;a`9V&nBY z6X4S^#*w~*Y$m5&949B zG+y6t#? zsbX~#P8b`S+Rc2}w$bI75mfImB6knw^~y@`FoCJBrQ5BK$E$b0F>3;p4!4-qAA!4T z%~-@c{(3Tvomsc2!2_1`^6U<1b9XMY?0eUev05gx%zc_sD%mt{2w%O~%{HQ@v)xQv zmM#(YhpAnc(An#~dvUp8VB)#=;xf2sx4F-KiyE_m?*94-+~$R6VpHmnDu;W%>eLct z|L#}&QXf0;*}c0`f0_CmoG%|to!5VT&$`rtO&zJO)c8&JrS5{XU8xzHzIy+j6y6oq zo7$ObO5K?{n%a~q1Y00O%lu>EeHRy~7gPTP>gogZ`CRJnQ}2a;?}I15nED~4+grrW z2h}xJB}k2xz(#=yY8HG>gnP9MAr3enK8>8Y=k{4TY1n!OS9HL~83$C-gDP4wzy9(b zD#oSvRFUgF)<}lAzsMUM(QNNBGqx}3nj!BZG?{&d(y(Ub3XfF~?rsd;Phr)KEXa3v z`Rm$-r|#8dIg8W--n7BHx{QmsSC{27ys6!28vivkT*eK)(IO+b80GE}#0YyJGhb`{V+fH3`KJsbnbrAP>+kcAl=S!W zM>F$q1zwo#B4o@2-1beUg=BtoRjMirLF;86tOsFti&WV&YnWo90bs%r9e)qOdI zsJ1p=$+~>cT<#&5!@kPBVNX0W&nT~|+LrH`+w(osUqy{HXa|+V{Q*JMQ&qJi-*b0* znPx^sX@OHmjik_c(Pw&c z6UodsG1U2o*rO%$wbs2ELv*FQKVJXTxz}RIk~{L049&iFN~!ZVwM4p-Z;q?;H={&L z=Hp65zJB_9Orq81>!+{yG13iN+F(;tW$sU0P%x?0xj%6o!KBvmwjQ(RHn6uKviC<5 zh4%i4ovCr#du*@?+8NrSBkC|)Y&@&iM%thbL*k8Nehl2c7TiQ@{ZrU565MJm-{kI!V;|I)ge`(N&AZ>GWf@Zv>0}QnO zd^)Z_pBn3TpBe2=e?EQFpHHRq=Tj;D`BX}OKCRK8&%W*Vhc}Ha+FYo|A^oYxA^oYx zA^oYxA^lm)Ji}cr{>Ja9)z|M!WJKs_dss;5#D=8U9p>Ue{-)`ie(Lw-&PE2ZupQNR zmUBh7xdI?}8Tor_b43SybJ=8qlj&VdjDj_01_g{hwBx=zn&HhDjo|fNOkQ6BTtPQV zVNCi15Qj!DAKb(oG2XTI&D6804}qZ^S3uPMUAR#GgL#PIoff&;b5|F})t&b&N`>dU z8Z)r8_2Bh8VCm8w@rE_Q8QwGe@m>lm4Uk=)I#5TZ3qdToLy|BhK;eFypvI54Wu1Nsm&H_g{ON9E7^&_7#Ue0g>ZhLloJ4B@d3p zF-fXp$*yeItykE)&G8D-Y8dr+q~mX4l;P_dzYPCzc#eWJGIC1;H@NZ^F}w*Yys}{D z9=HoDOkkpMc=?kzLOBnnEh$kPU5X1(rgJTY;DbxyLT~n~1)x_jT%#D#J~!B3(N|s* zhUq<{C8)MQnA&9lQO8ObhLOC+3{$$y&ck3Ar5skoN*B7w;`y&fx+=^jn>ZkVXRJFa zhowO=4B>ND)Dxo{rPiw)mTs)Xonry5cWQ!o;;?jMWsGi2%DQ57<5$K@hMBFOLDov? zr9GGVq<6`9DZREp9Mb~S!c+2(b0}k__nL81dMjU#^b&D?-N@2g zl}~!lNVR`#RG#AM8jw`OlJlwMNcB0d2 zd9@LA@Wwn7>wKRyBI$mKNpN=7s~k(9sQct)L2@JOKDlcVP}BQJ*h9o_KaI2xht!C> zPrBZhFN!MX+F_wlJ1jKnhJ{Amu+XR*78-P%Ct$csWb0zlh$2xpEF|iNg~ak< zA+dZ|NGu-~63d4r7t4o*#PVSwu{;KeYlYVA9~Kh*!$P8eSV;5_3yJ<=A<;i9B>H2J zkXm!wu#ng`EF`uK3yE#RLSoynkk~dXB(}vMA;;tPVIi@7SV(Li782Wsg~aw4BqSfV z#~_gy7u6=)W03f~aJ2?vkdRM|qq=)obsd*fF{nCEj6+q{6@zM(q>4fHl`&Dg24YZk z+7*N97e!q=Vo<$dSX9YjQB9RpF{t7zd2*qz9WkhWLsG?{`b9|4fH zD~?}keU~!_>X9M+IFFMqn_DyNunAJ;<;b@kU&|H%Yc)a2YqpChiY5%I7&QafypAZ1>TjCC-!1;QM0n@!ZQ9KoHh(a-@=50fLcu^hn{ z?1@@qIkMhaZm4}d93kRZj=&~2>(^)LZCtKfkCA@k_=gD^3d|M|ogG~VYbYqRW$`qK zTXjRhSep&Yq^VQ|@=C6xH581pBydCBnX4!dRlyz5Z$|T>|=x4oDa!roM$o4f@IPLFmFMO2#96tiyx zcPOn6WZT_UE!jM|a1B=8-11Pak?=J=jox(#h8u8mnUq{I#WXj%v(R9;Ucy7tZgz5S zcjxUv9qz^LjJ~%$$+D%Z+iAxXmhSNQRa1b;@Xj~fF^TVY>uPQ>f8u-9=uf?U*Zhg8 zg45-JaT^f^ID@#l5$@0MyKi@uHLdmb_~f#@-9fo5XVcPGpr^F|rlV=Cx3@o+<(>7; zWqI4^b6L(MRj3v1v%G!hxh(IjwE(UPy6vF?iXj(gO;rW=4oH&V<^d)FFz977c^*V0 z`P)Jy`P)Jy!L|VJJK(^$>VhM#s)JjGIv>wJg<7VM>f!Y(SZz}Z{vh&dn^JC5@Wvye z!K-bErq-rZj@CJn$?SHU@4y$mlgCmyL%w{p=!JI(KN*C*lF9532hFQAp?> z4Ua@fMRh7L%|&!8Z0ZlR6{;YK#qDFr387kZnQ(1qd?p+ih|h%g+{R|YYXJRByJrnD zy?tr6u}!ssg0HE688sQNj)qRaJy@_Y?I?8khvzHxQxLOP+e=(O<{Ds>UuXtM@> zZ-Cz)gx{Zn-~W7(QolrDNhq}nt|7V=_5A6b159*jQU#S_>l)7z!QV&91zbpf`L0z{mf;N;Wm4I!zb1zZq zfu%}4H48Riy+x@Dpw5G^TM)P6yjrf*ccHyoE0yYmc744{sh42VJXizyaF5atYL)s6 zP`VAvm0C6dp1DG)lhDroRWOvGogcak>YbugNj>xx+WT;WQnx^RFKz;o!{Q0)cc{GP1izSp`BkD1b#z12lhigwDZ^3K|bL6==DmqK|7}( z1Pq{^du{}*pq-z18$2J{dGTR*Ht@gc?MnR&+WUL(`)X+K+?$m82K;^ses_X^U3>)S z;P)Q*T>}012l)LU{B9fqd4u0K!|!tF*Wsf|Ed-hT=rN^sK>z05tkgGwAAkD}z!dt| z`%bWLpntdC3VnnAJ$4(&6!h=EM zvjE>4J`FMr&%fm*s2iR?{$;=no6q-Q=mRnRiNH^ zO@Z3`3|xxyX9emw7}GQ0F0g9`3e~KKp$A_sR0IE4sNTO|l=_{nQR*FsN2yny8Ku7d znNi?e7Lxe}6rgwTZ@g;)H^mjHU%%(4f6=k6yS|Uo7g73R`g{ka90wZvGp`U3Qd0_U zhMdoi2DBA+=N6)VCw+FPu>jr{_*V`t#xnRUS5@%4g8pOL7H~N>!mBaTaEzh~+=!H| zJo39>^!eT2QDtK;eC_6O1>k5tKC!B309t*X+E|FKUjmL*0hNyw`VIXFkVD=2f2hjy zySL899wea;`_y)I5PGsh4XPW|0r;JSZ~N3<_og_3#gl$`rUydtKH1KjIOH zK&rGau2%u+CLx5GD*w+jY7R&n>NosX2%39Ifu3t#skgri)OyG%QbS}4EA>iI8+PA`CU@@0kAbv}ybu58fRgmCHxz-WvH12W`~WqLoaKhhCEB_wx5~pm$%Hcm;pQ zx4o+|m+^Nza&~;w<@|jDZ0|}=S;gNcLRj_qs2n{8!=m()Vb(o9IY&PQwq!-=&x6_Q zcww&oVwjDS#X0)(VUCW{<2_Q*`Y%)$s;v`p^iv_!7Nx%k=H}yt_1xZz;RNC<5&CHm zl#9|Q;O41ld#0=DqQ5iL3_)L_N<@2Rs+pp{m#9kw{Vcf6D%$=_)upNd+GF{hR7pWU zTg?{jnFI0^?QbcBGo$UFtL6&&d1{{8IzETbe7Hd?O20rY5cFkm*l_E_9Q{JIP|z<@ zi{N{XUyIdZQU4OSJuF)PQnggnzYHv(t&?)~zeT-8&|^q8$}hB>UXIXLfDIL`zfx6- z`m4a!h}K^XwpEnAM%4)VT2(9Lp$_gpi_$Mw%LV-k2>ZSg!E>crDd<>k6zFoDem&fMl*Qhmueyv&y^tti1POVd~MD#-k1k|JTcdAZNe;0(@lMy_- zRX614^vM))of3Ht3|dq?%v0L(Q} z`W;}6N9*6Ib_)7k3Ow}Dx%OY9t`YRR)owxmR`pi(N~FJg)E+^<7p(qhd#**xaC`$y zl3=hFg2xCy=+7wyIjX3z82^O7FQK&K1^r1(!!NnC_F_y!gZEnSx{&^O!KG9dr{7%K z0!l;QESI*L($KukrM-pHz(MoUAhO`4q2K40McdI$Lr>OC1CQNH1Mk^On;b|(tlat_ zGU25mf-W6+;*qp9)L)1WMA9^V;GuhI=+EZr({$+Hx@izy@Y1FQ(jfZa(LtodOM~cy zmj;m(FAbs>UfLyrG>C3^bP$0NY5xn>4E}6XpMp>QtpG+mL^;g2LiqNF{B0C`n+*b{ zDM!P%B!3$NngOCBCT}e0h0pM}aiA4SnX(9U!podD9y9{h`I7nyq)h;Qa22GupIf~Y zpT_Yw{`Slbn@vLj+Rf)i>1^tGT6?b!mbt#o=J`~{IFb+izvM!`1-?KbGV z(eUlVFwph4F<^gfH%Q_=p&7N6zm0>r<`01K55Y!6dm1HWW&_H`oQCnH`~BttV9Xv&~gO*4gPrW%^_3{5f6^fS%*L{n^NE-*9~0?jt2nMyQ84Jend z)?Z|3E(V%~Of!vWl&L3SXr=?rBBq%^G_TfUzh12`F*GxQW--%TqU%wbW){fSX+Y#s zpqUA2`95dm&5bL2cBN!(T4GS6gP#w-P)0DmHJf?}Q62c}qmYg=f?m&Tpwuz~OR(_G zjzqXQ0BmF{BY2=ct5yRtC_kgX+v#K(83i&j7ixhpFZ`biGJ<1p6wsAI`aJJ*zL(I1U&O(!32!Fk3kRAhgECkAi2E-3m zd*GWLjp$o0Qa2iG@wMFR8R;>AbeH-B)Pkc3-_pATYJmj<_`lL1JqBuA4Cza~&t+bU zPvfVY%Tn^`8fmmB%G4(fqGK6R)O8EhrwpPf)j33wBRNEIZ&nUb^wo2SjwM7tZ4kv5 z)IYVJ)NM2+@}eqT>Xju!AImD4v4KAv#VVim{I_^)Z9!ID=?? z1Ip;D^?Jq_M~K4W0m<<=h;|_Amm3;AV~m3s2gosu1C;e~5aB?YRYap2^o%hM;u?$9 zA3?gNIiF}&n0oY#F%DuGi`D0tW-8GvZ&(H?cE%V7@r%Xk^Gq|1Xll)~^o%hMX3WLv zkC|o$(Nr56J!6c6nP9PcnfrAK(dhA+f;kFjjBzkygvV!8`rqhLhxU1y`YiMW^&3X8 zwT$445EiOGf^?iQiiC{7CZvdrz;!YpBVT}eP{-l@!Rw*-_FGhsVRS4v>Q)&&hOb)) z<8&^uIlE^?Ik^;kH$(uvn=tjMf)T-Gr(0s5kztB&B^Elf#?LG$54V%Mx`FZ zxb0$P_1J`<9-AQa*o2@Sn;`Vq1c=V!v!ouIAoSP-h{z(1)MFEb9-9DBSfr79Y=Y2Z z6TtFE8mY%72t76dtXrg!dThd*LXTmrpiKRVk&%fkBNItRzG!4*qL2}|eKR5>aEn|- zMkWdwnMg8X?Xihs)LA_?afFS!NrdQ^45E`5QM`q1q585x6faoIjXK;*owLW_=D-M| zxZ5f>GfWbC3~$EINuJeXlSUY#7^f;ze`*k&%!uO7iiPSc2GPj^QFu311kuR?(a8eQ z$wH4!4(hSVLXS-j>M>k%%GqO+gL-VT&|{N>dTg@LW0Qk=Y_iZ}lY@F}ve09bgL-VT z&|{N>dTjEWLXTnGvP^x|$jB6yktrl2e`aK4ijWbwIyoXEQ-q965i&AG=&>nc)LA_? zWrU47jQWaAuJ9Sh3J!#X&t* zEc94$P>pg&r#o>apTCg&xB-lr`!? z6T8OMlZ5&c_(U)B0+1LTyT(ZKblAtFz03#K7(W6CcAU*bI)AT>ui3 zQC|XD^tdo;(4k;YC`AV@0Exlab$x@5-|9#NUaV81zRWZ_cAX-c;)Y4!v3~*T!PvEo z@t$35_FR?<#es2UDxsbP>=5q@8Se`T?>~iH^y)7Zcwb0(e+BXo(+dgjukts<`_K3r z;{5=8!)VNf25%jAzub8B7ZTnQOWo3QiOtzPD}*Sn>m}4v22nharX_ePA^J7QMMS3x zM5hWwrwT;z2KyYMc<*?Jde9&`HHhfc5r!zPiYC<8;S*)_B1ZHgLiEoKq8AB7FCs+$ z0`gEsFCs+$lD|a}y@(Kf2=Y)yFS3Y&M#b2oUaPohgdvJ+$_e$fkg5WQF+T4xZwc!VK}EAk0-${;$85yhjZ)73W(qSFMT z(*&Z^1fsa}Fo)+pel52yeT7nIOFX25Lc_kPs5wU?ey( z!Xy~&sf7AlgXnZd6pv9)SKl#+P8WzyCq%6!Fr5&!mcVo&!P5!RYQP>5oo*17me+Jb z^a`fY5`4L_&h#44bdun|Gn|qx=v@QW64YxzxNo&YeUEAMu7PFdS$YjVlAX*|2EfI*82t-Q+q9uf=wKPkDh?a~nL{XO{)MDE2L(o;8SG!iZi% zi2k!d^b&#SB?8e)1frJ+L@yykt)+R1K-5~Amy9q(abH_PJ!cTbcXsPhKZ_9k7lY_5 zf#@uO=q!QgEP?1OLeyHCvkaor(ws$zT1#^l#ME%yNK13ph_N(rFKa^m7(P+UUdni1 zN_hVS(sACpRN#Fn;hh8?;oN>H;cYF=O9^jlXYX$k z*GWiA&@}_78Ir6SlB5~_4RTR4B!y;3l4h_TQ<5};^_Y@E6DLVCSdS@bG=ub*lB5}| z$CNahSb9uJ;V~tH9#c|yOi5VXK#eXvrljzgk`Tc}8tE}5g~ybHm;};Dk0}ZBRnB8d zg2j(C(qlsJC+9IG!9qeB=`kgR$CLz|kw$tg?!Bx@-oLu?Gmr3?W{;qm2S+T<1PS%Lv7P2H zqH_q*pBhBx2t?-yMCS-Z=LkgS5Te#&niE8H&Im&k=h1|E!5~`7h?WwfKQoAy3Pei@ zQR^|45~9{)Diw&95~9{)Dz%6TkEwKoA&OQ=LcQA{I+qchONjp5AUandI#(b%S0Fl9 zAUc;2wI0)4fvEME=8iB#(S}Q?-!+KNV?^f>qQ5YR&J&2v6Nt_eh|Uv;&Lc#v$289% zDm|uogsAnH<^?^bc_YSSLi;$OehHsAZ_Q`C=M&!lVepHFO*q|4R+6+d7Z9S>(p(URz2RYvml-$uU5 zgnX3=`6?6gg)h?1tzMRqd|6Ag%#K)LX_k$!5sQ9)LcPb#ISU!lg@ow;7(^EeL>CG~ z7Yald3PcwYqSn$}7({g82tyR3BnkCigXkhg6z`Cmu6}J0T_g})M2K2Ta}gnGEzLy& z(M5!)wKNx5M1`ffXoMk(F{XripFwmnBZ~L&VN6;3mx~3Wiv^;K1)_@uqKgSpYiTYP zh+0c?@d!f{BXkM%euL-|Msx`w`hNz|B?8eU0?{P`(Io=WC4{K8G?y4erKP!q5Ve-( zlAxuzWW-pS82wDB*WeQ^&83X@Qo27PK^%2}^TX(9&EcEX`#>OLLj9G?xV}&1J&U zTo$x6mkCRAS^kzBeD3Bu@eYgTqrv4Jn0id*{K-%>AfD}mE zLiG(u#|UQ%qz&yUeG5ejq%C(oAO+I4NZoBla|)zwJ?}nFfwXn0Z$d4&=LpshA}7aE zW*1iqS}~H&6yy3$nffb(XgMQVPKbWXAX+XEEfXU-t9^L zazfOefGvmdOS7V((Yv_HVf-#u-!_~nhw+Ov`ZOt?;<8KX$6+!u~7-8~VNr-;OAX>?Y zRuZCrXArFvh*kF2VPY?Z#>0M~=d)ZZIkRWYxsh*z%|UR4QR zRS8~I30_qRUR4pVzGpD53QB*~2$OzXO)pd5H;7g8}n-f3=YQ>Y(&jzp14kcR7@)9~fTMFt2KeS3fkosu8@Z z5xlAqys8nrsu9v(6O{g%5hne(N2E;sqd~Nm5v?Ue|H&X)D-f*}h}H^3YXzdULi%fi z(qAj2zcwiSwLBqf0V5u8BA9wAnRR@igj{9}s^abRh)xQGx zsCO`~06xO00Z2!ye+BRn&m`zGo-2Tl)73*<1D^4Omo< zNqCPpc&{{gYcFf1z-P&;C|(%@}(gX;5hD+%v6`c%T%@gaoh zDnfLEk>FK~DBdqVT}?EIt`dl@5{Rx6h~mA#8GJn!N#`m;6yBmph^`7Ex@v?Wiu>>q zbn7t6=w*!PWrXN?2GPp|qL&FoFB6F3&DI%JY!JOn$mnH3L@yg*h~h5BggPG(KtwNR zL@y^qFEEH+E)cz3AbPn#6z`(Xjrz+4qL&8|y?lfrihDp4>OzBPJtJCAh~n$CaNepH zh}H{4>jk2Cn|lt?dP4Lfs0Hd#O)84(SPsr6%Y;+$#OYirzckk*Ga`hA&-On_7zo(vOUag-E{_+!m8lI2~ z%`;kypWO^_cBR~T19!fEn0CHL_p!@e?f7j9?1#S>_PD>F|Kqznay#L1=X(Q4qPxSp zF_6|2NJ|IOngeMqB2DiYZxv~J$9P*HZM8^SL%X!wMVj8Fy(W;hHjuVXr0KSFh&0`n z&OlmMAgw!)c7;gOZO(`^-R5i{ttXJSK9IISr0IV2iZtDije)dHfwawmv?~K?TLNiU zi8P4if?Qo4Nb7Ub(0*=!w45evU`^OSny>`MI%>iOp$QvE6DDE&>Kf3Z?BZ{z31>n% zore}YzNr8;VM9<8HjpNq#WW#J*dR1v1B@c{1f(WxAWe8F*Avo&4WtQ^Orv+cOHJ57 zns7GLXiaEuJlC4Afi&S9rqP*}+@ z4WtR@F^%5&uC=9V&}W4kers2W8ijl{vV1j?d>sI(LHTMF^3^EhtC40}D_@ObrfsB| z*2-67P`(;TzOIEQp$s;HryrFay^7ID@-^RJ+-T&>&Z2szZ6x_xz%*LE<{Mt=nYNMS ztBh&1e9aXzZ6nFoLZ;F3HAl>}jU-=-m`2N2($Hx6Y9#qu%rsiQ^zHqx)@%7{B>B3Y z`>y57%CeTPMv|}HOrzz?-rhf##&ILb*9}ZFpD@(&{%ZXKLsJGb_7ZN-LZY$qzR1ul z2AZWzvxI1@1+mo7ECZTlO!F2^qh^65sfH9-2SB;>kD$aRyD>n0)BO(fU&mS~jOrl4FmkzC^otTm0RH}Q6> zrV$hQKwBq=cbf4|6W;iaZp1q+@Jah5N#HSHVZ_X1)|LY(WF_iZysTYqMf~3 z)sE3Jg%)<1`jLrow*tO;M?@>&yHNeJiE+0AzPTL{t$^=BzW=Tj@Li;;jf}PezU!5h z*jB)|3tkAWCAJmt#dY^NV*S1q@LjBa%rp~;CMnkMTR}rCRzG1Hy?$@^0qB{pm15lg z$~5{0>x8LC&wQ;E!pyf={X5g>8?1{>J=(Hrg_&=$dX;JP4c0}5 zM$de$p!pZ8pE8ZP!P?O1nXeUQzQyWiOp~O(zgmy`%+SZgQQrzP-(vN1rYR*Fy>9zz zy|%1cVde|3%)ZfUvgoaqsb4_raRzE*`NB70E>ypSbkvA#LcZEazUs%!)PP<`cJ0O^0ma!Xv?aNA ztBvH#%4r+KFi_rS3i)ay`Lc4_2K&2^#>%OduQrk|E2nMXxggC{Azy7IUsg`rl$I|m zr&_++NWQF`wka)NR!+5iwUK;TIco{)3nn}Qw!-R zsqJE>X{VW{4)Syj=wmMDZ|GyL;BV+-u7qzmcek6FMn>D(p%o>n+t{z|#s`qmwsx|W z>~6(&;{#ZmTT5y?`2efkJ(N>KqJ$He9U(80Wyq__5p0vPD^S#`2bm_(LR8U+ARPn zJOSvV4m@$W%f#LH|+u*0A)gA?fRc{-E@&5z@DYq|cry__NTSL;8bx_|qh$mml?k;PdV(^tmStou$w)h-ql~N-GP0IrBnjL=saPv) z;k80W){>08&F~Fwx*!>m8fq=c$RVb2y*d31T*p4lG@&TiT9T2sGfgN8ww7e%CZ^FE zYQE4=Ye`0qFpZWGec!^X^;$;Ol8g*7jg}D`$9b|2G8YzK2A7tTJFGO3L9ngx!%FfRn!5uptWNmhF zJ!UtuvADDr?I3Hjn`yK+V=XSNMLWpayn<=8wF!5dKwt2^VlSzW03ztkSc^+qLHW|( zXuknhR?1*yO6$5#=42;vG7IUb>pBf5^`4zh;-uAeo#Z#zh-|0eWG8X5#~{~fIH`Rq zd(x(pI2l6jTw-%}&ysxBBL&x`%G7#;Xcr^eMTou?#x^3_B@pcrh;|7?y9AgGK(t#R+D(Y=H9EK3AgcX4W%iYI z6QY|8>fJ`$SpQDjY~7@7_HaE~+gMGa&pvdMwz0B)b~1M^ONHbc*HhQ1&42~!aa>7F zs9%}5Lk4)G_xxpmH`CQzBkdXB4et3%HRv+YcM@mFR$2#?Ixo6+A_KhX;J2=2fH!C_ zSWivQ1Q}>WiTW=ScgO@+bTVX5&ojKq2yd>~ykQb{6+u1onMT`6dhRW5(EIi?WGkIp z3-vcQhvN!&LjAYlRhD^`C0<==#!*)ADhuN%_x|WC@oJ0VeHO-1MxBCMk#kw%l|4h0 zHN28`ZI*cTKZaM?py!<>Uj3SBv|Vd$O+9O8iC6#2G@4h|*3`3hmU#7lOr!1Eq_AtV zWY@mNG}^AUww<d<3(`dWa+IHHm&5~VP$TY_D z1{+w%AaS2dmh9Si+wSaS;p|F>&yI?dbh)4l~>@l2BK{m_f|eGiK`vv#ZUhTQ4wMFECqAnDv=aw_aej zeneu1`)O9It)|Dglcr2PXr!(e5Y*mAFCe&3^&13x0m0nbNiQI{P;KKH(A(I~-;fWd zpjOmdy?|hsvS*ij&HTU2cnNxr=>@u+x6y0ne;M2ErTKpVo`I3aUK871B)pAYn*Sez zCu#bh$Hg<45+S^Eo*mf^@8#|ds$F{Xytr`;Gk^COC0M|~ets!UfaQYi< zS>W!dGPMhOg(GDn^LZoj`5H(^?Xpquc_Z;T39^B_+z2Bj_qOVdWan8vZzMiHYp~yF z_^dIrYmgg>&mqjtB{paGEXiT*i{Rd}GPTWsGcIwHo9M^ZEj~8y^^NiM{L(8HiMP4Slz)idL=DI z_27z#t_N3Y_j8-|N}AQiI{LR6tfa;2I;PPpX;vHS=-*~qNjtzadL_+jV;%k5418X! z?&S7FSJDKz8r zs~OR&3DH{&qE`zqB9$|>$e*H4_PJ?J4BicuZ-f9r- z6NvT+MEeAyeFD)wfoPvWbOp`LGmY-=BSftn_Zcrp>+G54O>}*vPox~5om8F6QmzE! znV!4hN|L>WTMNHksL$w3QCkb2fKxn23+EP29W_OL8P4(GiJmFy{RK^hRRvY>*N-5j zs^E#j_tPn#486@_EATCMre__U$LJSn`i#c5K-%^|+CU&}M<8uyAZ=G5?V3Q^?m*gG zMVju%9+9TcxaiZp#5=thwSx97q+ znzxBGea`2QNYfY`4y3(Zr0M70B+~SAj|9?&0%=DBX~#sGwsN;Z+B)?+pdZjSL&+;s zx4}1@>H1lV^ph639nx{8>o;0N$Lsq^i`X;z{iH=62CG@uhp`m9a@$W@#KuzkjTW)i zyS5%2-N2c{g`J z&oxabmeT*Gi>078DN}bEK5t__ZzDe6W%#^J@Ohiy^EScfZDO|AMtruhlx<@EwXu|K zBW(UfU7U-hY-dEb6QXw;M7N9ice_AzyFhe1BZ{$0!CxttBp?pe{+E>$}I zgmYCcmNLMY4G?Dc7|aF)W&?!Ty^x3cWq>fdkH4X|IlrG8yQO(AZ_yi*At4R43M^YkZD4(lmXH<4>3(BmNG!v=3%A@#Zm@H+dRTFp;*cQ z#Zn$+nould09Kq9tH+oo6iXSPSjtJJ3B^(dD3Rn6|ilqzy#cxk6 z1#PA>^#rsSXTlvUn>$E0kHWlyGvN*)n>$E0FM~Xk%^f70PeKj)TXZJeLF4%;gU1dd zn=+QNgJkn*rV07yJ4iN9F-^!n-$AnZ4AX@C^Br$${~T@EGIbhyh`id#yxK{;I%asa zQ}Al1;MGpStDU5Kt<|zq&t?X{ok3phBwjtoG$CH?BwjtwG$CH?BwoG1G$CH?d{grZ zeT*{oZs;NMY8Ufr7xC)2;ngm|t6hRuy9BRx3100YURfV>m#{o+EM*t*Dm0g#-OP3_ zONC}p^w7%G?;1p}VMMPXL~k~TULz2_Mj(2PK=c}c=rx3>jip=@MD&^whA8^CW$HZ! z(cO&bZbI}O2GQLD(cJ>k-2&0w0@2+9(cK178B5tsh*~+`9gL;yCVe91_*}~3**z;H z!5BMOryc=Zai+wmL7BP_zM+QL!|3lJ^xq3y!I^iDL0|izdkFmxLP=c%uJhWNcMqZe z`kP%B!OdxAdb9@6F?Wtxx=x`(v+hnXg{p1+5z z!jCac$Oql?rt?8D5>%#67(VZ1KJO(y-)~0QUcu+Rg3o)!DBCOeyq8AV`#@TdKYNAV zvOehE5vI2=j#dWoMm=(_WkjzfL@yYlN6xiEZ(S=8y;dN4EhCCP=(U8X)Hl)5e0KWa zT$YNq*7~3rXDm|>7%3cN%mxXw4;XDTC@>o&%#u(Bwap-5_Ip67zeVl*LBh=Xpo2yV zr4KqtQfPh9!JrR1NZQ8wpo2!+$o2d|;e!sEld*C=e^B_KgC^o7*YgL34?1X0#>(~l zLE(cAnv=0|J%3R6po8XQtX$6@6h7#n3i+Ue!Ur8RCu8M${-E$d2hGV?xt>1=d|s?R z2z)|~FbMm?y z_onu1a2=vdec147Kl5ro@#+r@ul5UG?H9b-FLRE&F{vfaR6R)ffx?7SJw$%T_<>To#54Vf>+lO zudMBUov=Kt4|*N(Dm0g#%lYu^o)wx!adoXsJ!)pr1B~baLiA$>(E|d}0|L>#x(AVdd4g&hq zVfVD2c@F~m)8TLJgB}F*rz`7&9t8Afs1HG|t`E<`SReEtpx?oJ$`1nicxFVNg*gbV zDB%;V2LXMgv1gm~PP&7Deu=Wa<3Z5oNMmoA(`R80f;KNve*o!d^&A9kjx_eXjNavW z5VUy-oKm$k(X%kB;Ud$6i-E@avIoukuD24QS z-sgNT#i#L8&Sfe2biLw-J0w=CPXTf`DsXQEyg}CJxI=)iKDlv-blj&6zK4vC)A$}D z9cOPPIz&3ozQ^wn={Os=KSVliC)AFTf5_-K8Ro(OZe| zK2gm@y!C1#)9Cd-Jx{0xeb>t&;B#(mPwU?|TH_xk>H92TjidW8OW$FVzCVI=^sWvI z={qc>@34@*!z6uefCHj(n51uqLFKTKKFcM&*X1xt-{%as51Sd*-Y=!4?=VT<=b1)J zpFUfR?@ZIr!gr?qG1Hh;BO!f zss`d)hz9PON~lSIJo5D>;H#dyZ=$(-GNdD4ZxVC&O*D5~t#T91-S+K*HvwNW>YawK zH__aUwV=kh$;{pM4i5d^i<_Vo;W_T?=B9I5Dl`usAw>TKWCsyF!iXLrL>HO3;t_+W zJ|}d95KS7?jtE4L5Taj%`jB5o2+=PY$vk2Zm2U?UJcLN>)Jzb)3_nxNFH{Mhk8hzu<5zsYocQ4nY zZ@jTI`o^0h3U9nw$~5}Mn@WSBzVYS=-OIa-Y4nXZmF8Lc#+xGwZ@ihp?a?>hR2Z5X zBR_cK&3Q~yNBt@{G|LUm3ZN-wnw3P8GBm3U&1FFImyF@%L}RV;dPCCyG~ZwvyjMAA zl{XohG|+sLX_|?~-ap=AXj*~hd~OfkA_%sSY0qjy(+)HjFb&?Ih1NaZZTxEeT0^rA zXf9-$4x+KveW#)60-C8z(@iw?H2f8YCId7VF%6zrS73$e@zrB!)&tF7albYYjr9O} z4b4WNxtQzOL^Ss1rOk%sN}!p>G+T(q-n?{`p}87p5=_%aH1_7Dt%jx_Xr?pGHlneo z^S2wC0ic<|G&_jKp3dKCXm$Zj3DaCdH1>4uhe%8Q4S&OV=WqEN`i$R!Z#XiCf?9HjwB+A0 zO-M@)k(T@}(}c9-5NXN3XPS_f93n0G3e$wNRH>8!oDFxfFkd_>R zw=|Wge`cDHmK=h&HRy`m-R-ReeEUc=S&mQl0&dNwnY7cX+m0Z2=;1~s9!Qo zNJ|bW)RO)9MDJO*+-hu>*`4CFe?CufdLy*c(6 z$aSf*a(xV<2}rZZ&}g|n26A1htXv<1h%wTX85%9u$3U)2m6hvbAlFDU-_U5eJ_d4K zs;pcegM9=@Gq+(reBzylXw4i0xh_>!u8%>)7-{C1dbC_01G$Fyrs4lFh!`VH($HwR zJ_d4Ks;pcegV`TxW*QnT*T+DvOO=)DW55ZdNf;W-i8(-H<@y*t7igv$8ZFny6ho8TInn)& zNYnM*Cen0$w+GVh2&CN^NV_YLc6T7{orm=c7koH(0?PMVB@j%+U0%=bK(w+>YJrziM+DSugbR5!FtL30+@Eb~Ag}P+4 z*48(Jw$|~6n?YMws$UmqE97R-)|Ei1we`)Qtt*v{5#9{ix=Q^oQ0n@|stxM@_}e(R zZ}KfrJNgGVgSM`LTIMv=!l%{NH$y9`Rf=gQ5>3+3Xl;EnXzOZK&NNeq=GA&#kJi>V zgSM_#6-;wJ(I~L?@mYFj&CQ^#t0BFPK5Jj+=j$oe2yYQeEBtJxPyP4VermrOHNqOT z!f+0CK|;L-NaH+v3vfQ!3ipTC)O;vlqNWz@U%wRzi(~Z;1YFEc>^S z?5{EC-)3ZA$Kh`ivVR-NzD55w;XB<%vTsjk-)3ZA#^G-x*{?C^-)43t=oq^)_xs#N zvR}(I+ILz>u|&IKbsPCkbxflpOgf@d)Szw5+sJoX&NSM0N>TiCrrDKn8~IK}Mq+L= zyAo{7R@<1jk?%B~X`;T9egEQZ@7vAJ6^pmN4f%GG5sUY^#P#f+6egxM5L@w(;zGc`i#uTWj~^ zp#7atD~){L$%x)bh@NKhf#{tA(K`vzVyFdYmpg-q-Z{b$MehaP7!Q3$ zjd2$vdKV#jfkE^xf#_WV(YwT~a+lB;cZpf$E`z9zN@Rq@-RM;&)G8zWcQdcj(OCx3`vjsjMn>-&VTfWh4c_wxV-`pK2}bk; zA-WdQ5z!L@(G!HIjUt>NM6D-vLLhpA5VfAv34^Hgq)rf`cFsEy^rTLRIq!s-^Q0$r zLd9j!khJgF0At=`(C+LJo* zrtqXNx|&dFBO~{-jNDH$vd+lJ{X&o3FJ$C?k`e1k-7jS1ev%REN!@Q`M0!&9lZ;qT z>i(c7b-(bW?hkrW_m2Qi3gg-d)oi%&0CVF3;zozz#sh{M+LL-faN_~uhV`T#AZ}Ps z>H*@0^`ssUIuP%-d`W#pJut#_Ag&4|REt6MK}PgJLbTH$`k+AcL4oLl0?`Krq7M?H z){}ZLi0FeO3{hNDNvKwX=tGR?LxgCTLG&Sk=tBb0hs3P%kkA+piCN_#gQ)bR9ul+4 zLqSjKAu+2w6!fGX60^!fK~L(TH?=2)Yh4M|W_a~5^Xg&ZRkz{Q!-iMdlX{qVWj(2f ziC5N>dRR#R!^A7=Nj)s2-+EFHk1*-Sl|pzgszLM-M)VOv^a_LMBL-3JNj)MEeS{FT zp420R=qacbE!am0QR_)PA`rEn)FUGdQCw$DsCI+sqm1aIglNVf`lvwkQ9{&uQjZEm z9~JuKQ9{&uQjZ1^eRPB&imTKKwZq$K}!VtwZ{)Fl=h@NCbPZFY=4WcInq9+Ma>q(s?M6D-vQXqPg5VfAvNrR~L zq)rl|){{CJ^rTLTIqzi9lR7Epypuss>ZI_bP6j=xlfsia8T6!13Qy`}(33hTJgJjG zPwM2G!jr;1A2}I$oMq&3l94Noj65#%*yBP*9w!;Gp48()Mjj^_v7Xf9Mn<6VXu+LL;h;KsX%8`hJ07jeUS zQtu*eSWoI*LI+w;>RlsD2jX6(gj#QO;1i7K6NKnh2GJ)3qE84!pAd*XArO6n5VfAv z6G23u7-5LwPOpU8U=V$h5q**nz1kr9q(JmZf#{QBR(Vorj3>pc@}xmjdQwk{S>?%~ zC-tP5Rh|rbQcsFm<;kEY_2iq{lfoT%3Ds+O^%V2!DdJV1;nh=ySK5<$ig;x`si%ln z){}ZlNdHsBE9*%;C8XbaQcsOA=|@{Lp*9*spJqg#CPcRyM4vW@YESBEf#}nOsP&|t zCPYs`t>{TTO^8}g>S=+f^`xF2L5Sim=A&@c8}4F$KkQ1zoy+)tZsEQ3j+Xb+C%&yE ze+uq8MhxBEu+Ie2P6yKPeF$#Z=K^WZ2hv^$q`f?{sX*GN18IL4NP8)e_8BJ)$L=XeOQ^>{1K_&VDb@_9NHg?9I<8xt5}M%@X$Bh+ zI3+a0DKRgeBF$hU0;htS;nWDy42UR>-h|p@5PgObeTER-W)OWw%wEqBqBbJ%j6n1m zf#@@YsEr6bBM`L_foDb-qNw{4YP&)7G$VSN5Zz-CJuMJDO^Divz-dC%Mg&d^L{Af< zHX?A^ASxpQrwLIT5jY);2%HwS+v#9L;Iy#aP6s0br$t2IbTA@tT0{g+2O|QfMMU6q zFd}eTL@_m-tk7f63K@BpWW+`Uo)t3kEXjzC z2s~?KL`DRjB^j|1foFpefoDZT;MrhA;Moxn5kM;>$BpNh8_y9pt~K0v&TvCV1fCPz zc#gPXBLdG6H*7@UIpT(m2s|frpp6JTH^Ow_^MvRQBj3+6qR$heg9g#(1)|RjM4uOk zJ}(e`o)EPWf#-vWK0m?`MGH8gb{a%qU_@UaME4m)Ul54CAP{{)%qlMkjq!q*RbDWN z%80-VVpe$}7!i0u%qlMgBLXjoS>=UbMBs%tbwmI?lZ4u3c=c}P)w_vT`wg$&ZFr?4 z0`LC++B**@tBR#<_d!7rC5gBJfgy+ohAcVFkcW(L!JM<0bIv(m6ff6^nVfS5$vNko zlS5K5p#D|W)y=%v_xrs3-@?US=qg}p>ZIqb4%NGRAJNLK2z(=2xfOwLAp5@&t=x*h zH<0~qMc|v5Wk1(-k-1fg_VPq~3DJ9%XfGvdR|I+i(OyE-tqAlIqCM$Zc@Er5h`JSl zUO?2X2=s~>QLc(3bDI+F?TPjlqW3A$-axds5OtMQZy?$m`jg&5)KyZwgG77Bj3}=u zMCNuS+Q$>^BSi04qJ5y%_YtD5lIjCQ`vB2CLey1KeSoN|r252+D6hyw<^d(z*Awk4 zM4wcmeSv6SA?hlrzCzShQhkAFUm@x$slG}SE2+Lh)KyY_gOyZY81woDE2+LP=JgF$ zQhlM4>Km-2`a&huH&{vag-WV#u#)Nvl~mtgCDr$&sHAv>E;0{lj`Z_6(ob^aDb107 z(2wyT_rUjNOVBVi1NC8WFAqX13l4!LiAZBIuM8s1fm0l zs2f!VLXR;JMwNj|6f3ELFscj;R#F3DR2dkoqz1yMGB8+44LqqUDZXA3nMYNtL0+pt zqSbS%)gaZ%R#JmRD_2Pk60KY%H3+hQkZ9#9sX>tau96xQv+U=qO_6y_i4OKe2Mf{X zmFQq4YAdP1KyRB{ei=MEN>#Wd5y0hk2sIgyDm^TcF4iloT zk{YH&v631lL|r8{ELcemgE4Pdu#y@EW8Sb}B{d8xsbRrNY8X^f!-AF6FsP)41uLmx zP)Q97R#L-Gib{(24IIsp;XX%(OO9;S92pM%*l@^^;gTb+k{S*N3fC_ zE;-^Vso}v&YB*FTRa!&XuwK#dWihO4ATh#Ibv z8X;=9N@@i3fv%Do5wkv!_q#;q1MLGxdZHtR=yoMK5{Qljq9cLmNFX{=h`LH@WRU2{ zm=WdOLXr7UiH`C_M+wm#N^}$u9R);3!Kg9{dW=yps*F;iSV@h7QDs!Hk{Si0%BWx^ zH3~+RQNc=T)Ja`Q@h+~&e56{9_F9b=t#+zbqg5+gNsSh*TqQMHv~rcyXvqH2qLr(p zMnm?yN@{e>vY+?BMdo8AI>r+nBSd#8(J@NYR#Ibt=olgDDycC-v?o0)S5jkysH>#L z08v*-jfoji-a#0dPn76bPjsvh-K|8&0@1NT)KyYrf#_K1PsR#SS4oWx5*-^eqP+hy zGM_5Zah~WnA-YG2j)PV|PKdfnY8((92SmpSQCCTg1EQ{y8W%I7yn8h=J(cKqPjtKx z-K#{$1JUt9)KyaBg{Z5f#sksuLey1KsW0F~5)U?nvn29?xAP-CK3W1^^$ zscKAAHEbm{5!9F{YPd>jqNw32sfnV7tE47EALuHni81N}`7}w6YJ8gHe?Kw85&!8_ z37;mJM9Lg{iePfUHznZvHsG5Y@J$Q&rU!g80=}66->iUdcEC3$;F}xp%?tSE2Yd?x zzJ&qbqJVF4z_%peTN>~!3;31?d@BOJl>y(XfNyocwVG{HVlb~mqBt3&$5ttP0879T3XJDe-dL#3> z5}oXcP8Op3mFQ$3IvI#ghS||%82Ki{>}awQ#T9|cLe$NUCI?ppCd2G#a&SdpGR%%9 z2Ui3ppVTV?+^a_B3)O0h*J_GrbwIV6qFUJ%fhnSuTM?KdTDcX0DUkhBL@T!0@Hw~TM?KRGon13jLbJmbh;-xU5Ngm zM5hDM=|a@42uv5EZbe`^5S=bW-HO0;C5kHo(}k!T^QH$^1g687H$Au_FdfFc>A@9& z>98U&J-8w;9aaRU2Ui59!-~N4;EKR>SP_^WToIUlQmhDYb#XLDX80VLAvyA+=Ew}_ z$7Vo|%#a*$D*`hhM`lQlxD|mJnj^R(Fhg?0tq9Brt_aM46@eMS6@eKsSP|g5?x-3w zy&5w`jl-(OOjX0K2+RaEW{MhaMPR0=;Z_7@iW+W3U?%i|Zbe{b%=$pCiX+oY`@mVA z=qw@nlMXN`vy~`TQnO)HnH{X8X2Ym5J6K80hEZj9u#%d6Qdd&E))SdNs?{8?)g004 z7u9NxYGo^_Iii)Tq~?fLu9BJq**{0La+TB^$bMHz&52p|^GaD{`YO@6p6Fa5`l}M1 zt3+)jH5Z7^6{4<^nkz(m(z9|UHCKqbN@^|;b(PfIm=Wc5#>n(jqVqh_c|!Dv5}gM` z=Lu0)NzDVI^PoSOCq!K(H7`hXUd)K{Ds5!?E7AF$=zJmin-ZN5t$w}`b(Pe7AUYq2 z&KIJtl9~@hT_rU?W<+_7J2C^5=mJl4fe>v^zva98EC8Ylgs7{e76?&SNi6`P3xuev zq!uVqtfUqQQCCSV2v$-HV9Z+(tfUsen71HUNiBd%YC*7)S^$;Qf?y@J04k{k!AfcY zR8k9qmDGZhqLSik9!GOzq0fF(wqOOu!93;9p zW<>c)XJiH`(IuYf5+T}2i7o-6OMvJS7*&=)kFf+sl_g3PE2$+gsw@dsQcGY|SrV+I zmcXd8Bv?r;IjJitz5*SY!K&3#uhmk~>L04rQq{^ymwBSgglK0ax=e}MN@^JpT_!|bCACb5_N2#gCACb5x=Lyp z5OtN*vX~L&-4Br&szjH2qRWM77bUtJh%OhRu98{~M3+NN@``Wl3EF4-pXJlwGzg>mBC7C zB~(%?gO$`usH9c~E2))GNv#Z4QY)d7S{baQR-P1<6z{}3nj@=xj;xX#xlD6p74&1P zAV*e7j<`x{739b&$q`pctw4_xDkt`VYF zDA6@QbPW()14P#V(KSNURZ?q$MAyWODDS_F%t$4=))QSTM6Xn$Yk}xmAi5Stm9@}g ztc6i!trEpbYAuW^YlD^4S{PN<1}mwxFsiH#R#IzE>Pm|D#YSe7YPHU5wNA9UO0`<2 zTG>i!ooMAMsdb{2tEARJ_OBDITqU&*vfouw>tdGuysJ1eqm}4-PjtNyy;_N`SE9C( zS`S3m3sF}|trwy_>2X|1trw!Ml3EW$T_v?XW<+^Uc4WpV(G8yH1|fQl65RkqHwaNz zNo@e48=ybgAVggywIN7!LyU;>$&8Lw?a7S4`kfx36B>LnVBXWd?lv0>1qL-+_SdV8C}M;QKz{`yt@_ zG2lBK@ck6<{T%T967c;R@Er;Gehc`15BUB##>c(kM)E~wto95Web2B_dWLK1w|pgV zBaB`frDt#}0vn-c*a$ttM(G*cioizb8QhA%#u)VsOq5%1WX37cO`hl`A$pw>-2_B8 z2~oEqut|uz6@g7abdwNuD*~I8D6R->5~6NJU{i2KU=z&UHU(D%Ho@F&Q*cFK6RZeq z3a$ujf)#;H!4-i`up+Q2xFWC#Rs=Q$R|Gbl6e|MUn;*@Q%|1sqOO9NxIkFkXhH)1h#-0TSN`FBCti&a4P~^L=Cqhum$=+w<545W_=*fLLxI>`@pT9=vE2Li8pjx($eK1ESktRM`eS z#x@vLwkc6u5!eQ!%C_K&z&03Fwgp!Nw!x^fEx01E?WA52;JI~VCaPB3y;j>rtD9A; z?W&bs5!fzTxfOx!qLo__*bdphU9@s50^1?`-HO2Wm}Ng#CXtz>M0a?iJA~*hN_2-3 zwJQQUfane(>Q)4H2+^MOIG(ZX5Tb5HU}@sohXX?G9E_yP=ZW9jv5wLnXC4 zSV`?ZDJm&mV>+56dwh=UksRr&IkE@(u|1F@dn89(CA9}~WRK*CtEBd5j$kFVM{>kf zQhS1x)E=m$_5>@bJu#@Hcy;fn8hgDOdqs^qRE@o=hOMObf*N~84OdC+6*XKXwO7<| zmDFD716?JxH)eexuZ>1#s`i23d7|G5(L0sscR=(zAo?8;{SJtJCq!K(^<9wYcQGT% zE6b6YrbIJ6(M%zFmlDkcqM1N66GoLx=rJ;3RLNALSV?8VsFE41q%vVt$qZIfnJ}tk z1}mw|le&`P75~UgSFQGWt@eplcdJ(WR4ZFa?GvqBCACkqa+TCR$o_qzm8+!oLH4^! zYG2H#* z$BZanZHmlHC3?UUJs?EyRiX!g=m8<>DyaiN^Z@iH2ZX4rqz(j$9*7xHzE&5RSxWSv zCwfqb-ls$lLaRS0L|r9y5QrWGq6dYjtE3JBQCCSFj2ThB(ixfAO7xH?dPs=guS5?4 z(L+MiRZ@q9sH>z70ntN3)KyZ4lqgnGhlHrBqz(lusY5X49ST-bhhWS*6s)8UK_zu4 zSVFk?$o(9?%^59{REGAxFNK z9C4M@_mCssOOCio>U+%*tfan|9C4M@_rXf)d#I$o4^~p&$DoqpJqJhC_`$33gQ)SK zs_}!WVJoR0K#dIYH7RZ>4dALuHnA7a)A@{Wzj%+WsZM^E%eA^MOK z{Sk=%2tDpNSV3CHgD0`d@{ptE7GfqQ3&s zUxlcvq<#gWu9EsSW<+`aWn>m9(IcMd5h4175IhU)M}n2q5vZh& z1S_c{Cq*U2`*9<)SaakzpCi9Xjy$P3@*DJHzd?@tCOP6Nsox++ev=$=mDF#VBUnlC z2vXFzO6s>@CG{IrQojW&so!EyN%2nT$ShGce)nqpE^0ibYW%Kh*h=bmP~&$|!&Oqh ziyE$y`d!p;mDKOh2f9k?_n7s8e+bc~O7ss;^baBWv=aRTi2eaY{{W(Y0MS2$sH>#@ z2on7xMntoI&qtYTZ^<`#9M7o|K21VW{OL4FBH+sw@SPU$ogVOI5BPEfd}joFIRn02 z0pFPcU+#eKtbp(AfGMxIjlfq` ze1!wPA^~4f@YRvWo)5lO;wuKe=He?J@Rc~m$72rXUu2eP&tNF^3QILZU;9D-dPaK& zlQ@ljGRF3`CUH9bBT70q@Shl=4^_oMbA3k6rlHyue5~9`l#FQy!{qsb!IlkA*`fiIEOO$)n$gEJJ z**wu~Li9N$noWt?6@hF(G@B50D+1YsXis_^x2?&bVn&ol^vJAIqNjVJrwh>+l<4Wu z>Q5Jp6@k-%s9O;@J!V9CJ`|bNN;JDCnq7##s6?{^(d~1_C(e(FMGm{ zd9@{m$2{(ZvdfrPN5{qNiGngNR!J{TpY#0mb2X+A_2{lb&7L?qG)EloT*5MkVh@p*iAs=Oy0sy=#&qZnQqWvGYVeDx?NiCXrdIYMkNKI78HUS=Bg0)v&YFGeC_q zL=CqhaE7SiWjSy2i_AJDn$r`_DMVjUqB((RP9T~Sh~@;M zIfbZO5y%-NnlolZxhjs#dL^366U`+=Usa;HfM_ltnhQpiT+n0Wf>9-x62(d?7mO;o zf|XP*7*%owE2&&Cs^rp91uLmsCv_#os}+&ipjw^jwK`L@dQG)DQ?;^{)S04{tEA2p ztz0E_CS?DaqLr(p&V=lDmDHIr%YI(#iOfbNn%fi2Eks{eqPdl*t)y}T(cD7RRZ_Wy zXis_^&tY;4QCCUj2BNN#${jPJyiyjKO-l4EPxLGy`i2rc3y7X2L|r9y77#rP`jfMS zsH>#T3KBglW<+_NF*2K#=-Hm=*+TS9C3-fr`m=?otEA2bqGtoqvxTUuq|OGSu97-C zW<+_FHZm_M(LA1L9wGWR`FTYu4-m~GL|rA7M~J#gDi09NBSc*#l}CwUC6z~rx=Jcf zu#(CHV_u$MC6x!pygb25Di2grd4iQxoV{ zr1C)@=qjmvG3x{QYExuhRigPl(fmTRn-a|rMDqjD{6I865X~<{T_u%2NHl-Ui1M|% z$h@XR3wWXhgy_3Uv;Yt-07MJGs8RrWi~=yK6i}jANfm%mr9iNfDgdKOfnX(707jJp z!Ah#YNnJ_tHPpzwu3DYrwK_+%dQY`FN42t*)H$M+tEA2mtz0E_4rKp1qLr(p&VlTA zmDD*g%YMEB9hotH zMEUxCWZqPw=X#>&3eoqK=(#}jTp{WzsdItoxzL}SD@0u-b#9R8xiKTkyB{L+mJ%)G zi53!~|5Bobpw$-=qOOuE1Vjq~(LzGhRZ@k3sH>z3#f&KL9my~y=*kJNckr%}q)DNl z64`RlPYF{_{n_YWCCSfqRYZKtQPpbufQa~(^Sd%4;#=PD%7}<>XXE;Si1@bmyD}o; zTY;XXQhG)DbAOt>`VbM{RMSYW8bve$a!h%Ru~#1=8Ua&HV;_@8Vv-tTuTVua0;ZZK zJ|@4!l#v*tSEwQy0aHy=A5&0bQqn8YD;m8*6;WN4YD(#qrHJY(em}umh16pa(s^pDare{k|tf1EaH_cB1$$>C5wQP zML@|SpkxtHvWO_@>Z&5Dq|5$Xl>Ku}5m7Qk?)X0CiF{OuDDQr&W=d-xSd@rfBz<5} zB6^W&q+?7`B6<;JqwNEW648sy_4G*YMT-*A>ZS}mgZ(Lo>EipqqC~WVxj_4qqC~VN zJ&Q55$jYQ!qD6^l4f5Ce)1S5fVpFJn?QTXcinl|qpY-P$S58gExndX|Y#fY!n z`B#ki7B&}B6!$&Fh%fK_vwVvY-=jPKiV@!;#?3Q}QO0)ke2Wp^wkD~3ixFSm`G@N= z#fWcFQ_jcOoquIzN5TFy+xHZszNe@u?_=!FzcLzQ`<`M_Wu^KUy9=U}#uO0sizRsH zUj-jycR{4cE{OeUb{9l3>U)Zsiay5ff^e0g-33uh*6u3#7`qF??nK<5W_LjpleN3b zK1O#z==&+I?}v9mRPiw>!e@UP?^fKOR#Ib1QA|}IQ##9Tiv4M2sMWtu`dmOU?&^Nl zYv+IWHGAHH8kuVJ?s;r0?(?g-ppqp($r3>&OMsFkf=ZSEB}?ckKPp+`Bvg`5E!`cs- zGY)yowb^DTcvpK0WyG<&?n?%Ir2@Xv0bd#L*`4zjfY0unFAKiPveW&-fG-*Fl?(XF z2YjgkUxk3LV!&4^;Hw<)RSEd227J{5zKg(TPXJU0pFIIkBjBqU@YM?VY6pCE0=~Kd zU%h~@e!$lt;Ax zS`uc1C83Wm34MG?AX-w0rqNuJiIxPSZq>15%!qQ|7nuf1w3H`WN{BX8qNN~5OF@p7 zf*dUcL`y-AmI9(KM@z+wD32VGNmHVwJ<-xaG+l|7h8!&oIa(TWv@{Sc4LMpGh`Jmt z9W$al?q-;RR7-QOYDe5Nau}MemZhH(G{*nW|L2p(@u-|MjZ~Mi^f z@l3xg>B6g(wl^+Ix|H*kdRfw?y!l<i{W9&@7EX@y7 zO>_S|b`@)X8n0rxO0q1?4^vGM|2$b&EBB|_)ylFb-D)Mzw2tb0q1X9B()oImOLe|b zb+#4Vg`o3=p!0>G^M#^wc6t_Of1&EUKP~I3^o64HX+Fm4Y}dh9=Lu#yJ(6|Cb+8k; zmUVou6&tC^mlvY>e2mR+cZI~} zcX`S0{65Bx8?K$$aihHCcL5(`#|_s`?6^^0#*K4)OxCL(ZiT44j2j_^k>B6hzu`Nv z)dSbeNz;PHMDD3ly^^V-WI_7OJOfAtB~wAkR8TS%luQ*RGjzmF4Jw%`O1AVdp`I#L zlx*c=R7q`Pwx>#sK~Kf26-m=t)u`ars32;bt7=qGHSBz>0`ycBL=C#hhqST^phg8z zqm5FmplYP0yPk^MWd%{At&g#4)Yll>t}2Kc?R<9$=} zkakr}=UNr?s$!k=tn;x7(yog87&{-Ut?$RK>{pQaSP36fMCO^bG{&y%SD=;sRFmRk zib+gOjj=2H6=+v(swwGXQY5B^#@Lnp3W-t_Q_9DbmYC`qQ%0#@Kry9#Oj(J!NMkP4 zm?XuN@iFBjrkci-*O*j_xxmL%keI3(Q&D5MSMT6CSC*J6%CL&YRHc}UeM~ipvHfXE zy1h16AyJ)T3TYo#AyGqOD#&Y@^qTrSwJ4^ef1cVB<8~I*(U`gv)5*uwlNh(NpuWa5 zpqR4$b2XHhviiBwG$x&5{^6gek;J&Vps~g@p_o#-Hc=tbRAO9R&`e{RQ%q<7JS`-~ z?oimDmZ32%DW;2$X(cgs9+Z;aT4UN!%!U3vx0M(--n7%0_7uZcJ$N2mA<@A;kAAL; zHKrrQT;gA=lf=03<{uigyzas=-Dr&n7=yS*uI|EJ(K2AdTs9O zEBfB0qVz83Y41`IdY6jOyHu3kg*p{^pB15ZsVKe6W%|h~YVTrOJXhh|yHu3k<#Hcm zdzVT|$o4K36KB&WtEZp7qRvX~o`rnrws)y0y~`E;d2H|E)UdrvMd@9x^f7kSj-Yp` zD80*7KF0Pg_O-a$v+tSrrquWE$M!BZJMyL5-ld}SE?4{KvAs)9{am(psVKe6H9p4n zE^anrdzXsRyIkvIZ13V`M=z(j&96$5 zUnP8u%`dB!+Y?hs@+-y1gl2`6PSRN+U-?LylJwcQr>N|etSm~FB0tXxD}$1iLCMOX zWMxpYvMAY(R$aKCtgK4fEO+a5l|{)=|8{)&dLkbcY8!mrC~2;vmd!+~c%oH=Xrx4| z0MRNyw2BbDfu4tZr7A$QiV(eC`;96=qE%u>l&`ua&A(~1WujF*(W*kUBKbK-s{+xg zK(wk5ElTW}XjLFuRfyi8M5_W(Uc2O~zG}>f@-@q(xlwbpnkQOKh!)Wttp-G^3DKMA zG0dSjK+|E?xPZ}Bm<|90b_ogY+_{<}H78}2=->HNUP7@8mO zoinOQ|LuB@6WR8U@3lfb245|1WzMI02b1ON#F4pGwW&_p*gap>Nt?o^v}#kGwBbEp zwlb_v+R%AL{|vn6%k>}CNt>g4zN(WpMa^x>y*g>b`)%;NW_8l0sA-|xt0(N9oVv2# z#*MAjNt>dkfzFkxlQ#T3wRNwS9b2oDHbu?t{**#xnaypnm4B_W!pG?6vXx==M3SE8 zPX9dRY>ct{%gR%JUryPON-=m1`~TvKvaLUO{{ih9qIbzXYYm@kH6+(6lb?Im8k%eN zYC#RiwHnk96fqZ3B-5)Qxppn}$o41RUpV44%c+Lun&V{qff|x))s<5X%{9l#_5(E} z*J}6}n``!3|Nb=F57dxcbDWNk(20Ch==whI{D@2i`kbsrO|M2xQKJg^S&f>YMomzo zCa6&p)Tl`<|EL-@gKE?SHEIUcs0nJ+)RvEG)Qo`|yyqq|6;+K|UX5C!Mpad#7N}7R z)Tjk&)B-hXff}`fYSaQXY6aD(1!~j^s!=NjYVdBS$W&4_YI`+miyGBbjoP3_ZBU~& zs8Ji#s10h=4ysWb)TkX)qc*5fJE%tO7^uPf%p!9aja=MQ)$wZ75jD!F8g*0+J4dMl zYSa-m+#IEjsL_*V5IkVX>dK#h8!M!ldK^+1h!K{e`u8ufx|)Qf={ya$(dc&Zxp zy&CmJjryuaeNdx5s8Ju(s1It?2Q}&k)u<0@)DNmrAJnKHRHJ?j)ZpFEv^!MQXyDao zAZj#JH5z~#4M2?sphg2wqXDSVAgD$IP@_RmjRv4bgPVxR`^JCDo z4V-f{6g8;i)tJznqoJsAzkjXJoTH)4Iq0SIc|voJhBD`%?+4JB(43>8%sC$LuN9he zG?Y2V+5UM#bB=~G=g9A4LUWFWGUs^EzgB3@(NN|b=lbUf%{dy%oP$@lEa%Xiqv3xw z=iu`RM{_65=T4gB4$rN)vQC4RoCdj*1}!-aT5=k+4WNg!l|R2SL#TgvNoMwx+lTk(K4IioNta%wg!U@w(5s|FuaXYEN;>o^>CmgB2YZ!t=vC5#y-GUt zD(S&qCH*AtRagyf`H@LcH5z#}8i^VuRgFfVMk7$85vb7!)Mx~1GzzNG2-Ij4RHG57 z(I}`!qZp{ceQsn*sTz&F8jVGb(yB&dP@^%Z(HPWd3~Dq6H5v!iXbfsJ4yw@@)My-3 zqj3z>;L$EJ57Eqwd#Wa0jV7W-S)DsKQ8nz`xe2JzMAUF|=O&^?Pg0RvUK3KIsCiiD zeN9vioI5uWHRu5{r)#2W;M}>1s6kJoF`>D06H((4|5~BBa}$|6(WV(I${&7GUb-1$-exk7X2CNg&}eN^Tp?L5=31MsrZ3IjGSb)My@5 zqdBP2Jg7!gKMzJlvg!ccr{vx8mX#A3s9p4sL=w{XaQ=p05w_!)o1}~ zv`RHH=<)ZpqjGLO-S#^XkYS0lsrR66I#P&MqFBLmdP5H;MKBSX~aNh|J9s>S4n6m3_T;~PD`IVEhTsO6chKWEukg1gxqNfEx9GM zS8H^0wBud&wYp+IYQKPD=(Hhif4QjLoHClrj ztwD{}K{Z-~8m)tBv<5X=2i0gD12uR}mhPaZYP9icv=KGnXAMw_4-Z9t7SK{eXMKn-3EkIaX9jj*j(qphfs)Hz36Rm09X+KL+2(<6Ca z(N@%ObB?y6Mo&`F{*HH0KBZ%GTUDdF?CC9~=ib_i8c+KeyLURN`+n_y*0!R?Gd{-7 zIr2$NitcM~8v`}?Iz(hXQZ?FnHQI?9`8|d-9gzw)Og*;ST*ckZ$6>R zCvZB%Kn=d?8PSz#+cqxtYFsR8G}BT1VpSt0o%@!HMGf~IX%~wc?i|F$qJ}#Maj~e; zoSud2(2G?KcaK}!Q(Y`-wD2)j4SNp4-5u*L^;#1_jZoqiTg`RyvASHGGWKDw2`MY1L7*;`^1e=Df>+*C7gOjMb{6 zXvKFkw=q^LI}g~OX3w^F6s>Ce7`v{JQ}#K#JDGKqb%i=U#;z;4+_8I)JIcC3T_0oD z60z)qASrAVaQ6Xi&0)5yo1Cox8!$L2^U%8}Bhv5zStG5gc(=dwA{iE^a0 zY2ssw+2=7f#^y*T%8}CKzu|P-XcHuDxDKq?~m9yk@fzFofCY2#JBzPWxYRQXUdqP-{#VpGKSZ- z@P0gwpaU9by-QKguW=vO!jOk1nlWN|f_iCTV-qE05I>gxNk8Pl0ECe`%t zuVwF;QAcBJ#&o8PNj3lWG4_rb?!G?uL_=rFm{ilvzm~mYhP~I0JJHaYRx4A@2mX2N z9W&fLd+dpZ&a_&YYCiNa_I^C>o;~(NLuXp8Of?_*7<)e+ch4SsKc3FCTA6Cz_3y{t zkEe=!F22`?<;*95KlaaK@5fU?7@Bl@Kc3DBz8}vgKE~dUCn?Wk((V0tI?Mfd-t(_z z@5f{Bf8*}Q(>cNSLU@FCy@vu+%YfNs!0fVEGUL6iN%NU9yWBIo zT$p{X%q|CJmjkoQf!XE2?DAML*QbZzY3Yc9LOJ=;cK4}Iiv#UL`tA$xFWp*_%yBe5X4a}|vW>?3O8J|5!n%>$rukp;T z5oUdq*)_oI8enz}FuMkrT@yQIe8%W}Ib-zab3^Vdk^8$}qD;0j+47h-PP->j{h0sx zjM25k{^%Jadw%7*fRC>q9vjD35s&rV81QjDe{9^%0pBeF->m`PZ2{ly0bkdE?~Z`) z&VcW(fbZ^r@1B6~-hl7Efbaf*?}32t!GQ0ffbZde?~#D-(SYxo#$$;;v zfbZ#Je7wrQ`Ij_(we4T)+y1rE_9ttdaV@m{YoYC53vK^eX#3a3uI)23Zl6grSjU*_ zJhSVBSwHPBuLEY+0ki9X*>%9|x>z#f{)^UJG|#U0%&r$^1C-hI!0dWpc0Dk=9++Jp zOJ>}^)BI1F-QbzsAj}3Svm1cf4Z!RMV0HsAyCIg$c>JTbsmyNl%x)BBLzLN#!0bj~ zb|Wym5t!W=OJ+PjNSYzqpWWn{-6YJW=ooMlFuMtu-2}{T0%kYGk{QpRl4hvp+0CBW z&BAP$=Go1_>}FtgGcdaunB5#pW<0-4n&Haq7SHS!VKzdU-2%*R0cN)Vvs-}KEwNeNz#neJiE;^yG@u)Rc5yVv)hE( zD0&Rf@NNTUw*j-;V#$o_x1<@Z%x?G0ZWm@_v~AuF%x(u}w*#}=f!Xb`WXAPv(hSqK z+0`@aD$J&7o^=IgU4dCwVAd6wb&Vx6uK$x}tmfGrp4lD3Y@FuV9l-1kV0H&Ey91cr z5ld#gK0@QB=GmQ|*`2~{yfV8JnB6JN-1X`^f!UqF?9Ny+QIdw|(J!0et_GUN5xr1@5v-Rqg%E6k=UvwMNry};~VV0JGs zyEm51c>OwQrYW=gJhS_R*>q)gA27QQnB51=?gM7`#gZAX?ZL`+?d0!0i55GUMwXR6FSy@PKFbfH0e-%pL${4*;_VfY}4U?15M^>*(G5HNcP zm^~CrW_*1yY36C3J?xo1EX<}8OWqUsFfe-49tLI)$C4Ree@&YC%Ip!(>=9wM zK=bSoVD<qrz;FGJ6!5Ju1vxz4<6GdlZ;G8cSw; z{XS_HE3?Nuv&V$l5@q%nFnbJ`JqFAk17?rKk{R!BpfyJw10MIx9v5aymD%IK>~UcB zI52x0m^~g#X1xC+X_jf8J>i)>AP>?vUO6fk=#mdtp6 zRnn~1JbT(Rds>*SQD#pAv!{XC)4=R$VD@zEnDIVJI{Zj?U_W+e3y z958zhm^}x~o&#pj#gZBK?@6;!^Xz%g?0I3fNtrzl%$^5k&jYjPf!Xu1WX9uP(ri{{ zFL-7z2(vB9>;+)<0x)|4n7shZUWg?#o*yL5R%Q00XZE5n+osH31ZFP^Gq-N?A~1Uq zn7tTFW;}mNn(fN$CC}_7VYWk=y#&l&0%k7(vzLI`OR;3e^UI{!smxyX%w85|yOi0> z!0csU_A)Sg8JN8sOJ+R(PMY1y>=n=K6=AkVnY{wcUIAvW0JB$s*(o?kWq|9FP%w7{_Gsw@^XkG(muK}~yfZ1!n z?6p`j;I&gsCo8=XZD6L+o#Ol z0A_Chvp0a*8^G+1STf`Fk)+wLdG@Af_NFkKscrL3VD_dkbM@w%!0b(6_GT=Z@%mBH z98hL&d1h}3vsudQEnxN*FnbG_y#>tPiX}5%UrU;U%Is~=>}_E-TbaEL%-#lOZv(Tp zf!W)!WX9`{)yyRA&)y+s_U>ix5VMQS9A)+nG2?rl+dFH&L(DERu5G?U%&PnQl^ryQgWjDI3Syz9D!ETA%5)-B0DlzsBgWc$^W?jt>^cwbg z@<>cUjj?wa>_+#b>}r1WG5IAXpT^ib40cPLLotVaOhJjsDeos|`nmdf3Q^2YKIS}$ zG5S3A4ujq34uf3{@36P;r-;PtPqXjY-eIsC-C?k+=|!Ky#uT&9V{DAQCuKLf!(dnP z-}-O<G|80r#b&d>kZgxwDuW%&I&y;c82D>NRT|T=L-*V;` z@-yG=#FxLjt4cZ(?M{5l`8L>HdVbdiyZfHsMrOUsXLsVuckrwvcUN?6ushu4vpcmx zjwvrOM(?`aUG6OStG0{obnjq}v3HH!pJv-&cWQ&F=7^8UFEJ_dJnk-^-Kh@Fw!!Xlm(M?ZjJ?ZeDg9iw4R)8ieD|H+Xoh9?7+f47C;JbX102*WO@@bThy~}5JxyxrZA7k(G zxj)U`Db?QPv%B2o^E4l0@A7G1YkyjK%JtXiUGiN%-JJ>l?mG(dm9}c;bb7~}o9|O@ z+7b4B%FT;RcJgy>zE5b5jvc-gtfop5w@@D^FHM!-z9$q zq4awY{ldbu2hlHV&QSV2h(3QWz3mx#5dFfwXXrun>5j>&MGvCi(T~nOXnxbykIp@a zKHm+zlHLv6-T}S`(JyLp(kpT6=#j8@6|Vqy74Jdxi<(?M#@mA^^XW%=)_eh+~cYx>X${8j%eL~J`zM`Bob7|(o?dAjDr+*-Q`q#vn+sy~ir+)x_ z`UlddpXHy=-7S`9rXR#|HqTewX{WL>`_MD{P?()fB$(NU!0ba|mO_tV>K_WTZ-}n_ zDJ!!NW66wnB+yP}W%iM0_K`5lqs%@6W*+1HcUAKlq!cXWLg@O>WeeG%||8Ss4-@O>TdeG~BY3ix^le0>7Gz5!pq zfUkeRHz42}81M}W_yz}jLjt~`0pGBIZ+O5rBH$Yt@Qn)iMhARj0=}^U-?)Hpe84v$ z;G1}ikLMnoe{`}#+kQ{q_Ipa(FQ9F|C$#;Z()Qh**n2{M*%R7+&)BtnX2$I^Y0e=w zJZJvQGy6=K6;x)Q0khA5*=NA)Ghp^vESYitl{8B<&p!9eJ{M-^Dzndl+2_FQb71y4 zF#9}~%(#C~nnIdqUwCF;2(vB3lIx5wfY}$o>dI`x=;i4a~ldB{QC1(n&RC_Kj!ujWFAx%)S9;-vG03fY~>| z?3-9J^vPedjYdv!t6bI49`}23A2bI?N3?PntH{O8P_LCvr3uu z_RM+0Q^%!+7c^$})8 z{ZCo*tWPYNaebRKYm`}E&#bR7+ojC<0<*rrtS>O@3whQzmdv>RPnxyLtevXudgM|24yzTGaD$(_A0Z1 zz-*u}E2h2vK*+O!z-(YFneqA~oxW3MgFLfA!t6U`HVBvv0%n7N*&tvxD3;84eKu(} zDYLG=Zz-+KEbN$(1U^W<-4UQ!XEsEbWon)c0cJylnHx8U zKz}v_m<@>~GhW}P9r4O+sAo1*nC(+$LxI^)U^Wz(4FzUHW66xKf6$J2Wj4$+8z#&S zDzjn0Y?v@}_2w{P=IYI1z-(A7nep|Zq$xrD7GDn-?wJi2W+~dA4F_h!f!T0iHXN7@ zk0mp{ewH+cG|xtOW+Q}INo6(yn2mt8IRe_|2w*lMmdyD2V$zh-JR9kmjTC03mDxyO zHd2_Cq2KZ9&q!hB>VT2JY-B8%@%7iFxj>nX^2|mFv$D!;6fhel%-mdK6fheF%tpnM z8DF1HnhTZLXwPi4F#BG|fYHEgG_=jp&^AW{v(d3+#@FwYCaKKEcxGdSSvk$KF~Dq$ zFmu<@$3UKq0cK-j$&B|mBu#l`Hr6v6E6je>JR1wl#zLNrg*+Pz%*Mu&8Sno{np9;r z&NCY)%qnP}jRR)mgqfS4jT2^Wel`x6jf*8S-XD`RKj>Uzyk|CEm{n9}Hen3%BV zqujYBdkSKroR6yIW9<2;vU=9Yo>81gryx>IZ69OLN4Yag_I%VtIUiNW$Jp~x?#z-s zqd1XHL8O|xKE|GpN`doH6XkqVJs)GwN4c{`5#_=F`Xq(3oFl6E7ykWso;BjVpTqu- z?&>&+^5xjQpOXW=Dd4kr5&RZ>_AY``!B;}=A~-GJn;!7Z2>50Oe6s?+*#Y02fNyTV zH!t9uAMh;*_!b6yivqsI0pF50G&-l%H3|BwNz%tR)V4oK`zw2f zuuQr=FFQ&4D|d!4Yui7OZT$FNE9<+hXzY1eZoNr!SZ5lOJ<-WRG);+42BMRJ=wu)| z8Hi36qUlO>G7#lchWEv~MsYKA8&74XE3!5gI zlT(S{(X*LTiC|$*a4Hcj;t5VAf*n1YdfCinN1UBO_kX+U^Y#dxvMSHgqho=Fin_c(DQNDO^YQno>fGqndaGa&uqFd zYp%?u1GDLnXVW3irbC`hk0mpnbw%bE&9fPv*$iRULYd6~W;1}<3}7|`n9YbKGoF=3 z=2vAl(=(eX%rcbOOkg$>n9T%cGlAL6STf^Tdt_Q_+nnW@%@SseBbZ0}J&4xUi9ZP0h^+l$wGMnR>%@Jnp zl-V3$HV2r^0cLZ6*_>E1!8f$0<*cmY%VaH3(V%mk{PcWMCM{; zHqSGgC(KTxnJ-ta^MKhrU^Wk!%>!ohV#$nGRU&gl$Ibbk*?eJkx-y#&%;p2L`M_*G zFqf@(pWO%t0s}TMDuK! zXSPh3U8>BM0kdVmY#A_H2F#Ylk{MrBip*uoY`JH)T$o+1%$5VQ<-*LZIW8AwZq0Ey zFk2o=W_;BxGFK?G6`t7&VRof5TLH{g2s3weV1+PqR|i%AvlX#q##bdHLmylEvz4CN zN?~@DGFu7ERzjYwggjd*%-q`c%2+bvtG1EJrp#7(W~+qR)yixYFk2rY&9@j4a`;pv(>zRtuV`}wbNQ)wif!cwa}lfh5l@9ESd4Hk;vrI z{%oCRwoaJcsCl*yn5_e5>wwuhV74xn%y?H#WNy+tTkn~z7iMQ_o~;LF>xG%ydAnYi zxt+J`g;`JCiLgGF%y`#PWNubw8$7cO!YsEk+W^cq0J9CiYy&Xc5IbhPyRcA_?=0Cd z(J@gS?iP9UzLEd?zxd9Q8;SkV-Gz2H;HH3YbHKMH;M*GTZ43Ce2YfpMzMTQzu7GcM zz_%yh+Y3JXJN&wht;Cip7LF3EiX-+u7f9hL{cXPF)h_zr>3-cz6Th|De87B>2} zuu8e3Nv@&ZKp7EC*F1nGk4-`XDpfVd_6J`Dzjal*)C!B zkTTl^%ytPgH`mxD%-sBJmoRfD-gXHycj9dqop<2x{Yk?2{_LXj4n>VS@wO{rzxSss zeDBXL`Q9IQ;%ygIRs1|<;Cp{|$@l)a6K}f`_IrOyX^cJbwkyHk`{Pc$?Mf7s=SfK~ zPS3VK&3-H2E;{j6)VLFGyAtO~%>J}u5@S!i?V=NJ;ob7M7yW3=-@PB6Yp}>XtUB-Z zI`0;pA5oomgU-7_=iQ+5ZqRwR=KE{5(V|9(OYf+i<{f@8t82kN>)ikEOW&?k}<7+;qg6LIMV=8J4pPhW& z$5fV>D$1~m##E)4H+)PriE-cSX;1TICaP1+n?9z7#8lANs;SRYi(=mLF|{See)s48 zv^pA7mtx-bG4&+IosqAvF%2l@9Us$BV%+)nG>u88n1A}1MiS%Bzc<#HCKS`n$264~ z_nn>1G^RPlyz66HNX+^AxiU1SCB?kwV_Hc}qzqeYOdE>n?qk|YOhJ8~b{f;3V&3;L z9V8~7#$2p19VzBtKBkkz*zX73pY{)p=}a*_d`uUKacA}~(U?mq=HEW%GW$HneuwDg zbjqzfweTw_CUmwpbaIwgV3XzpdPd%5wa@oG`=syrko>%(d!P0__8TPkN#EmkzwDE~ z=MCBq$i2-z>3eurg8hm6o{#kX?$f@|<=-*wIlP1(mz1-?HSPnM8B~4ROufe`g}&z_WTEkKFwqOGw>PF zo)l@H&z%vqKk*sSFX@ro^B*AkJpZmQbL)I`ZrR50JpL;mW9RX;HOAh#;sDVvYCcni z4(L3-y2jX^|A5TnKld?q9$!UcY|no{=J8+n7(0(o$~-=we!KPona6+WW9&RWMW4s^ z{0C$n|CNs^BA+Xt#@L?!0QLMu&DTDrn8et*Z9aO%3FdPmQsOVv1Ali7z}Gnp_{Z_EJsP;#WdkFh!8 z^tU;3P;z8|kFh!8^e;;K_abJTBca;n&-LKnodtYlE5!_?&%;@8h_b-WOb$^Nlr)3L z&slJYvY;fjW!q05qAV!sdx}Fc%XV3C$j`F57dRxd?7>Rw5M@CbdKP0YAmi@<=Q|u6 zqAd9T{f>1v3+CtfJLljlXngENW$qJnt@qgfchVJLdky%B)A_pt%Vf)utzotTW<-vP zq(M4k(f^8>yymnPgoQ*gEfVyvGq(}Ugt;Jb0fpu>`%Dh{zXtuDV@~~d(h~Un588-M zE$!IlegB!$q+U35RTc7$BFjm}zt13}=@8xT!uqbIzYCB(K$e^A z4YISydXSw>#^d!lWP`}~6?rV=l`ek1N3Xl_I{Hg~=Ern<>D`x8-hA$zHtNeqf49Bu zhWqZm|L&U~NNM)S4L99kGd9umqwHUPn@FeMKQm!b_s2f6|2DV&@a>b;_{{dH|4tD& zMc@>HQv^;CI7Q$Tfl~xd5jaKQ6oFF&P7ydo;D4(Bvn`vq?4wFW^S%2os{bqeJb>%} zjbypVxc=w5KQGy(Wap9HL&kOgBV=5!KSRd#{wrjK$lf92bpT!u;2M84S=My`e$3mM z-4DFh>b?H&Ki>U4`q6Ox-nT?HQv^;CI7Q$T zfl~xd5jaKQ6oFF&P7#PF0j_$vEap0!ujSKbEZW#%%o${SU7l-w-r~XaHrMQ2I_Dwd zx}WRy{A7I1pX>aBWL$r9t;|$M$!;RMnd}y_Tgh%CyPd2n*&Sqe zlHEmiH`zU8_mbU5c0btzWDk-(MD{S*BV><~Jx2C8*%M?>l08NCG}$v`&yqby_B`1O zWG|AvMD{Y-D`c;dy+-yr*&AeUlD$RtHrYF5|0L^1_Ac3bWZlW$C;Jy!53+xgeL(gh z*+*m_lYK(=DOpdl&&WO}`-1FCvaiU#Ci{l07g=wzK4g8#`jPb~8$dRYY!KOCvLR$c z$%c^)CmTUFl57;&XtFV6W68#mjVGHxHj!)+*<`XQWZ#laC7VVzoooi#OtM*Iv&rU= z%_W;hHlJ((*+Q~KWQ)m`kS!%!Mz)-61=&inRb;El){w0wTSvB@Yy;UwvQ1>0$+nPf zCEG@}oool$PO@EOyUF&D?Irt;ER$>>*?zJEWCzI(k$q401KE#chsk~-`BfFgJ3bHH7 zt|Ggd>>9Fb$*v>2p6mv)8_8}WyP513vRlb+BfFifE7=`ncaq&jb~o8QWcQNYM|MBi z17r`9Jw)~}*&}3+l08QDIN1|qPm(=F_B7cuWY3a4NA^6~3uG^ny+rmh*(+qPlD$Uu zI@ud!Z<4)5_BPo&Wd9`VM)oe*dt}|o-Y5GPSr4**lYKz;A=yV{ACrAT_9d~q0og*bMP!S~ zmXIwaTSm5=Yz5g$vQ=cO$<~mqC0j?fo@@izMzY`k_~Vbw^!FCBtz_HCwv+83+eya1 z-%Wq-A=^v#9a$#XKC=B}{QKXIG4}n{|2oo0ayN|}DKzrkMStHXBL;U4f9=0Q)ML2U z%0>@K$;p4(zLoxJEUqY{bAB}F;%lqi++<*D+0@QoC*XO_g z>I0iiI!!{e)5!fGjjDH=>*TYyBnmgndt%Q6H2&T# /dev/null + + +#===== End of Makefile ===== diff --git a/trunk/build/buildsetup/versions/version.h b/trunk/build/buildsetup/versions/version.h new file mode 100644 index 0000000..104ca8b --- /dev/null +++ b/trunk/build/buildsetup/versions/version.h @@ -0,0 +1,20 @@ +#ifndef CTRSDK_VERSION_H_ +#define CTRSDK_VERSION_H_ +#define SDK_VERSION_DATE 20070704 +#define SDK_VERSION_TIME 1421 +#define SDK_VERSION_MAJOR 4 +#define SDK_VERSION_MINOR 0 +#define SDK_VERSION_RELSTEP 30000 +#define SDK_BUILDVER_CW_CC 3.0 +#define SDK_BUILDVER_CW_LD 2.0 +#define SDK_BUILDNUM_CW_CC 123 +#define SDK_BUILDNUM_CW_LD 84 + +#ifndef SDK_VERSION_NUMBER +#define SDK_VERSION_NUMBER(major, minor, relstep) \ +(((major) << 24) | ((minor) << 16) | ((relstep) << 0)) +#define SDK_CURRENT_VERSION_NUMBER \ +SDK_VERSION_NUMBER(SDK_VERSION_MAJOR, SDK_VERSION_MINOR, SDK_VERSION_RELSTEP) +#endif + +#endif diff --git a/trunk/build/buildtools/@privatedefs b/trunk/build/buildtools/@privatedefs new file mode 100644 index 0000000..28f1839 --- /dev/null +++ b/trunk/build/buildtools/@privatedefs @@ -0,0 +1,21 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrFirm - @privatedefs +# File: Makefile +# +# Copyright 2007 Nintendo. All rights reserved. +# +# These coded insructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Date:: 2007-07-31#$ +# $Rev: 387 $ +# $Author: terui $ +#---------------------------------------------------------------------------- + +CTR_WITH_ARM9 := TRUE + +#===== End of @privatedefs ===== diff --git a/trunk/build/buildtools/_privatedefs b/trunk/build/buildtools/_privatedefs new file mode 100644 index 0000000..a06e2b4 --- /dev/null +++ b/trunk/build/buildtools/_privatedefs @@ -0,0 +1,21 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlSDK - _privatedefs +# File: Makefile +# +# Copyright 2007 Nintendo. All rights reserved. +# +# These coded insructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Date:: 2007-07-31#$ +# $Rev: 387 $ +# $Author: terui $ +#---------------------------------------------------------------------------- + +CTR_PRIVATE := TRUE + +#===== End of _privatedefs ===== diff --git a/trunk/build/buildtools/commondefs b/trunk/build/buildtools/commondefs new file mode 100644 index 0000000..c5d94a7 --- /dev/null +++ b/trunk/build/buildtools/commondefs @@ -0,0 +1,488 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrSDK - commondefs - common definitions for build system +# File: commondefs +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- +ifndef CTRSDK_COMMONDEFS_ +CTRSDK_COMMONDEFS_ = TRUE + +# +# SDK root directory +# + +CTRSDK_ROOT ?= C:/ctr_sdk + + +# +# SDK Major Version +# + +CTRSDK_VERSION_MAJOR ?= 4 + +# +# CodeGen Target +# +# CTR_PLATFORM = [TEG/TS] +# CTR_MEMSIZE = [64M/128M] +# CTR_CODEGEN = [ARM/THUMB] +# CTR_PROC = [ARM11/ARM9/ARM7] +# + +CTR_PLATFORM ?= TS +CTR_MEMSIZE ?= 64M +CTR_CODEGEN ?= ARM +CTR_PROC ?= ARM11 + +ifndef CODEGEN_PROC +CODEGEN_PROC := $(CTR_PROC) +endif + +ifeq ($(CTR_CODEGEN),ALL) +CTR_CODEGEN_ALL ?= TRUE +override CTR_CODEGEN = ARM +endif + +ifeq ($(CTR_CODEGEN),ARM) +CODEGEN_ARCH = +else # ($(CTR_CODEGEN),THUMB) +CODEGEN_ARCH = .thumb +endif +CODEGEN_CC ?= $(CTR_CODEGEN) +CODEGEN_AS ?= ARM + +TS_VERSION = $(if $(CTR_TS_VERSION),_TS$(CTR_TS_VERSION)) + +# +# C Compiler type +# +# CTR_CCTYPE = [CW/SNC] +# + +CTR_CCTYPE ?= CW + + +# +# Binary build tool switch +# + +ifeq ($(CTR_ELFTOBIN),) +CTR_MAKEROM ?= TRUE +endif + +ifeq ($(CTR_MAKEROM)$(CTR_PLATFORM),TS) +__error: + @echo "---- Stop, Don't use ELFTOBIN with CTR_PLATFORM=TS ----" + @exit 1 +endif + +# +# RomSpeedType for makerom.exe +# +# one of [MROM/1TROM/UNDEFINED] +# + +CTR_ROMSPEED ?= UNDEFINED + +# +# SDK build type +# +# one of [CTR_DEBUG/CTR_RELEASE/CTR_FINALROM] +# + +ifdef CTR_DEBUG +CTR_BUILD_TYPE ?= DEBUG +CTR_BUILD_DIR ?= Debug + +else +ifdef CTR_FINALROM +CTR_BUILD_TYPE ?= FINALROM +CTR_BUILD_DIR ?= Rom + +else # CTR_RELEASE (default) +CTR_BUILD_TYPE ?= RELEASE +CTR_BUILD_DIR ?= Release + +endif +endif + + +#---------------------------------------------------------------------------- +# Utilities +# + +EMPTY := +SPACE := $(EMPTY) $(EMPTY) + +#---------------------------------------------------------------------------- +# CTR-SDK path settings +# +-include $(CTR_BUILDTOOLSDIR)/commondefs.cygpath + +ROOT := $(subst $(SPACE),\ ,$(subst \,/,$(CTRSDK_ROOT))) +CTR_BUILDTOOLSDIR := $(ROOT)/build/buildtools +CTR_BUILDSETUPDIR := $(ROOT)/build/buildsetup +CTR_INCDIR := $(ROOT)/include +CTR_TOOLSDIR := $(ROOT)/tools +CTR_COMPONENTSDIR := $(ROOT)/components +CTR_ADDINS ?= $(ROOT)/add-ins + +CTR_BUILDARCH ?= $(CODEGEN_PROC)-$(CTR_PLATFORM)$(CODEGEN_ARCH) +CTR_BUILDARCH_ARM11 := ARM9-$(CTR_PLATFORM)$(CODEGEN_ARCH) +CTR_BUILDARCH_ARM9 := ARM7-$(CTR_PLATFORM)$(CODEGEN_ARCH) + +CTR_BUILDTYPE ?= $(CTR_BUILDARCH)/$(CTR_BUILD_DIR) +CTR_BUILDTYPE_ARM11 := $(CTR_BUILDARCH_ARM9)/$(CTR_BUILD_DIR) +CTR_BUILDTYPE_ARM9 := $(CTR_BUILDARCH_ARM7)/$(CTR_BUILD_DIR) + +CTR_LIBARCH := $(CODEGEN_PROC)-$(CTR_PLATFORM) +CTR_LIBTYPE := $(CTR_LIBARCH)/$(CTR_BUILD_DIR) +CTR_LIBDIR := $(ROOT)/lib/$(CTR_LIBTYPE) +CTR_LIBSYSCALLDIR := $(ROOT)/lib/$(CTR_LIBARCH)/etc +CTR_LIBSUFFIX := $(CODEGEN_ARCH) + + +#---------------------------------------------------------------------------- +# CTR-SYSTEM path settings +# + +ifdef CTRSYSTEM_ROOT +CTRSYSTEM_ROOT_ := $(subst $(SPACE),\ ,$(subst \,/,$(CTRSYSTEM_ROOT))) +-include $(CTRSYSTEM_ROOT_)/build/buildtools/nnslibdefs +endif + +CTRSYSTEM_LIBDIR ?= $(ROOT)/lib/CtrSystem/$(CTR_LIBTYPE) +CTRSYSTEM_INCDIR ?= + + +#---------------------------------------------------------------------------- +# CTR-WIRELESS path settings +# +# libraries should be in +# $(ROOT)/lib/CtrWireless +# +# includes should be in +# $(ROOT)/include/nitro_wl/ARM11/*.h +# +# access by #include +# +# SDK_VERSION_WL is defined in +# + +CTRWIRELESS_VERSION ?= 2.78.00 +CTRWIRELESS_ROOT ?= $(ROOT)/add-ins/CtrWireless/Marionea-$(CTRWIRELESS_VERSION) +CTRWIRELESS_ROOT_ = $(subst $(SPACE),\ ,$(subst \,/,$(CTRWIRELESS_ROOT))) +ifneq ($(CTR_PROC),ARM9) +CTRWIRELESS_LIBDIR ?= $(ROOT)/lib/CtrWireless/$(CTR_LIBTYPE) +CTRWIRELESS_INCDIR ?= $(ROOT)/include +endif + + +#---------------------------------------------------------------------------- +# Compiler settings +# + +CTR_FORCE_BUILD ?= $(strip $(TARGET_BIN) $(TARGET_OBJ) $(TARGET_NEF) $(TARGET_LIB) $(TARGET_SIGN_BIN)) + +ifneq ($(CTR_FORCE_BUILD),) + +### module subdir src/ obj/ lib/ include/ + +DEFAULT_SRCDIR := ./src +DEFAULT_INCDIR := ./include +DEFAULT_ETCDIR := ./etc + +LCF_SUFFIX_ := $(if $(CTR_DIGEST),-C) +CTR_SPECDIR := $(CTR_INCDIR)/nitro/specfiles +DEFAULT_LCFILE := $(CTR_SPECDIR)/$(CTR_LIBARCH).lcf +DEFAULT_LCFILE_TEMPLATE := $(CTR_SPECDIR)/$(CTR_LIBARCH)$(LCF_SUFFIX_).lcf.template +DEFAULT_LCFILE_SPEC := $(CTR_SPECDIR)/$(CTR_LIBARCH).lsf +DEFAULT_ROM_SPEC := $(CTR_SPECDIR)/ROM-$(CTR_PLATFORM).rsf + +SRCDIR ?= $(DEFAULT_SRCDIR) +INCDIR ?= $(DEFAULT_INCDIR) +ETCDIR ?= $(DEFAULT_ETCDIR) +OBJDIR ?= ./obj/$(CTR_BUILDTYPE) +BINDIR ?= ./bin/$(CTR_BUILDTYPE) +LIBDIR ?= ./lib/$(CTR_BUILDTYPE) +DEPENDDIR ?= ./depend/$(CTR_BUILDTYPE) + +LIBSYSCALL_ = $(if $(LIBSYSCALL),$(LIBSYSCALL),$(CTR_LIBSYSCALLDIR)/libsyscall.a) + +### Compiler & Linker settings + +-include $(CTR_BUILDTOOLSDIR)/commondefs.cctype.$(CTR_CCTYPE) + +ifneq ($(CTR_MAKEROM),) +LCFILE_TEMPLATE ?= $(DEFAULT_LCFILE_TEMPLATE) +LCFILE_SPEC ?= $(DEFAULT_LCFILE_SPEC) +LCFILE_AUTOGEN ?= $(BINDIR)/$(notdir $(LCFILE_SPEC:.lsf=.autogen.lcf)) +LCFILE ?= $(LCFILE_AUTOGEN) +DEFAULT_LDRES_TEMPLATE := $(CTR_SPECDIR)/$(basename $(notdir $(LD))).response.template +LDRES_TEMPLATE ?= $(DEFAULT_LDRES_TEMPLATE) +LDRES_AUTOGEN ?= $(BINDIR)/$(notdir $(LCFILE_SPEC:.lsf=.autogen.response)) +LDRES_FILE ?= $(LDRES_AUTOGEN) +else +LCFILE ?= $(DEFAULT_LCFILE) +endif + +TARGETS = $(addprefix $(BINDIR)/,$(TARGET_BIN) $(TARGET_NEF) $(TARGET_SIGN_BIN)) \ + $(addprefix $(OBJDIR)/,$(TARGET_OBJ)) \ + $(addprefix $(LIBDIR)/,$(TARGET_LIB)) + +TARGET_BIN_BASENAME = $(notdir $(basename $(firstword $(TARGET_BIN) $(TARGET_NEF)))) +TARGET_NAME ?= $(TARGET_BIN_BASENAME) + +### Debugger settings + +ifndef IS_CTR_DIR +ifdef IS_IRIS_DIR +IS_CTR_DIR = $(IS_IRIS_DIR) +endif +endif + +-include $(CTR_BUILDTOOLSDIR)/commondefs.emtype.ISD + + +### SDK Library settings + +CRT0_O ?= crt0.o + +ifeq ($(CODEGEN_PROC),ARM11) + +CTR_LIBS ?= libfx$(CTR_LIBSUFFIX).a \ + libgx$(CTR_LIBSUFFIX).a \ + libos$(TS_VERSION)$(CTR_LIBSUFFIX).a \ + libmi$(CTR_LIBSUFFIX).a \ + libsnd$(CTR_LIBSUFFIX).a \ + libpxi$(CTR_LIBSUFFIX).a \ + libext$(CTR_LIBSUFFIX).a \ + libfs$(CTR_LIBSUFFIX).a \ + libdgt$(CTR_LIBSUFFIX).a \ + libcp$(CTR_LIBSUFFIX).a \ + libspi$(TS_VERSION)$(CTR_LIBSUFFIX).a \ + librtc$(CTR_LIBSUFFIX).a \ + libprc$(CTR_LIBSUFFIX).a \ + libcard$(CTR_LIBSUFFIX).a \ + libwm$(CTR_LIBSUFFIX).a \ + libwbt$(CTR_LIBSUFFIX).a \ + libmb$(CTR_LIBSUFFIX).a \ + libctrdg$(CTR_LIBSUFFIX).a \ + libmath$(CTR_LIBSUFFIX).a \ + libcht$(CTR_LIBSUFFIX).a \ + libstd$(CTR_LIBSUFFIX).a \ + libenv$(CTR_LIBSUFFIX).a \ + $(notdir $(LIBSYSCALL_)) \ + $(CRT0_O) + +ifdef CTR_PROFILE_TYPE +CTR_LIBS += libos.$(CTR_PROFILE_TYPE)$(CTR_LIBSUFFIX).a +endif + +else # ($(CODEGEN_PROC),ARM9) + +CTR_LIBS ?= libos_sp$(CTR_LIBSUFFIX).a \ + libmi_sp$(CTR_LIBSUFFIX).a \ + libsnd_sp$(CTR_LIBSUFFIX).a \ + libpxi_sp$(CTR_LIBSUFFIX).a \ + libpad_sp$(CTR_LIBSUFFIX).a \ + libexi_sp$(CTR_LIBSUFFIX).a \ + libfs_sp$(CTR_LIBSUFFIX).a \ + libcard_sp$(CTR_LIBSUFFIX).a \ + librtc_sp$(CTR_LIBSUFFIX).a \ + libspi_sp$(CTR_LIBSUFFIX).a \ + libtp_sp$(CTR_LIBSUFFIX).a \ + libnvram_sp$(CTR_LIBSUFFIX).a \ + libmic_sp$(TS_VERSION)$(CTR_LIBSUFFIX).a \ + libpm_sp$(CTR_LIBSUFFIX).a \ + libctrdg_sp$(CTR_LIBSUFFIX).a \ + libwvr_sp$(CTR_LIBSUFFIX).a \ + libstd_sp$(CTR_LIBSUFFIX).a \ + libsubpsyscall.a \ + $(CRT0_O) + +ifdef CTR_PROFILE_TYPE +CTR_LIBS += libos_sp.$(CTR_PROFILE_TYPE)$(CTR_LIBSUFFIX).a +endif + +endif + +### Global Library settings + +DEFAULT_GINCLUDES := $(INCDIR) $(SRCDIR) \ + $(CTRSYSTEM_INCDIR) $(CTRWIRELESS_INCDIR) \ + $(CTR_INCDIR) $(ISD_INCDIRS) + +DEFAULT_GLIBRARY_DIRS := $(LIBDIR) $(dir $(LIBSYSCALL_)) \ + $(CTRSYSTEM_LIBDIR) $(CTRWIRELESS_LIBDIR) \ + $(CTR_LIBDIR) $(ISD_LIBDIRS) + +DEFAULT_GLIBRARIES := $(CTRSYSTEM_LIBS) $(CTR_LIBS) $(STUBS_LIBS) $(ISD_LIBS) + +GINCLUDES ?= $(DEFAULT_GINCLUDES) +GLIBRARY_DIRS ?= $(DEFAULT_GLIBRARY_DIRS) +GLIBRARIES ?= $(DEFAULT_GLIBRARIES) + +LINCLUDES ?= +LLIBRARY_DIRS ?= +LLIBRARIES ?= +LNEWDIRS ?= + +NEWDIRS ?= $(if $(SRCS),$(OBJDIR) $(DEPENDDIR)) \ + $(if $(TARGET_LIB),$(LIBDIR)) \ + $(if $(TARGET_BIN)$(TARGET_NEF),$(BINDIR)) \ + $(LNEWDIRS) + +GDIRT_CLEAN_DIRS := ./obj ./bin ./lib ./depend +GDIRT_CLOBBER_DIRS := + +endif + +#---------------------------------------------------------------------------- +# MAKE COMMAND SETTINGS +# +# --no-print-directory: No print directory when 'change directory' +# -r no builtin rules +# -R no builtin variables +# -j do make with multi-thread (not used now) +# +MAKEFILE = $(firstword $(MAKEFILE_LIST)) +MAKEFLAGS_SHORT = $(filter -%,$(filter-out --%,$(MAKEFLAGS))) + +MAKEFLAGS += -R -r + +# Check -w option +ifeq (,$(findstring w,$(MAKEFLAGS_SHORT))) +MAKEFLAGS += --no-print-directory +endif + +# Check -k option +ifeq (,$(findstring k,$(MAKEFLAGS_SHORT))) +AND = && +else +AND = ; +endif + +# Check -s option +ifneq (,$(findstring s,$(MAKEFLAGS_SHORT))) +CTR_STDOUT = > /dev/null +endif + +#---------------------------------------------------------------------------- +# CYGWIN TOOLS +# + +CD := cd +CP := cp -rf +RM := rm -rf +MV := mv +MKDIRP := mkdir -p +SED := sed +INSTALL := install -p +TOUCH := touch +ECHO := echo +PERL := perl +OBJCOPY := objcopy -I elf32-little -O binary +REMAKE := $(MAKE) -f $(MAKEFILE) + +LEX := flex +YACC := bison -y +CC_X86 := gcc -mno-cygwin +CXX_X86 := g++ -mno-cygwin +LD_X86 := gcc -mno-cygwin +AR_X86 := ar ruc + + +#---------------------------------------------------------------------------- +# MY BUILD TOOLS +# + +MAKELCF := $(CTR_TOOLSDIR)/bin/makelcf.exe +MAKEBANNER := $(CTR_TOOLSDIR)/bin/makebanner.exe +ADDBANNER := $(CTR_TOOLSDIR)/bin/addbanner.exe +NTEXCONV := $(CTR_TOOLSDIR)/bin/ntexconv.exe +COMPSTATIC := $(CTR_TOOLSDIR)/bin/compstatic.exe +MAKEROM := $(CTR_TOOLSDIR)/bin/makerom.exe +EMUCHILD := $(CTR_TOOLSDIR)/bin/emuchild.exe +ATTACHSIGN := $(CTR_TOOLSDIR)/bin/attachsign.exe +BIN2OBJ := $(CTR_TOOLSDIR)/bin/bin2obj.exe + +MAKELCF_FLAGS ?= +MAKEBANNER_FLAGS ?= +MAKEROM_FLAGS ?= +COMPSTATIC_FLAGS ?= +DEFAULT_COMP_ARM9 ?= $(if $(findstring TEG,$(CTR_PLATFORM)),ferret,mongoose) +DEFAULT_ADDRESS_DTCM ?= $(if $(findstring TEG,$(CTR_PLATFORM)),0x02380000,0x027e0000) +DEFAULT_COMPSUFFIX ?= _LZ +DEFAULT_MAKEROM_ARM11 := $(CTR_COMPONENTSDIR)/printserver/$(CTR_BUILDTYPE_ARM9)/main.nef +DEFAULT_MAKEROM_ARM9 := $(CTR_COMPONENTSDIR)/$(DEFAULT_COMP_ARM9)/$(CTR_BUILDTYPE_ARM7)/$(DEFAULT_COMP_ARM9)_sub$(TS_VERSION).nef + +DEFAULT_MAKEROM_ROMROOT := ./files +DEFAULT_MAKEROM_ROMFILES := +DEFAULT_MAKEROM_ROMSPEED ?= $(CTR_ROMSPEED) + + +#---------------------------------------------------------------------------- +# LIST OF JUNKS for "make +# + +GDIRT_CLEAN = a.out core *~ *.bak \\\#*\\\# $(GDIRT_CLEAN_DIRS) + +GDIRT_CLOBBER = $(GDIRT_CLOBBER_DIRS) + +GDIRT_INSTALLED = $(addprefix $(INSTALL_DIR)/,$(notdir $(INSTALL_TARGETS))) + + +#---------------------------------------------------------------------------- +# CTRSDK_INSTALL_ROOT +# + +ifdef CTRSDK_INSTALL_ROOT +CTRSDK_INSTALL_ROOT_ := $(CTRSDK_INSTALL_ROOT) +else +CTRSDK_INSTALL_ROOT_ := $(CTRSDK_ROOT) +endif + +CTR_INSTALL_ROOT := $(subst $(SPACE),\ ,$(subst \,/,$(CTRSDK_INSTALL_ROOT_))) +CTR_INSTALL_INCDIR := $(CTR_INSTALL_ROOT)/include +CTR_INSTALL_TOOLSDIR := $(CTR_INSTALL_ROOT)/tools +CTR_INSTALL_LIBDIR := $(CTR_INSTALL_ROOT)/lib/$(CTR_LIBTYPE) +CTR_INSTALL_COMPONENTSDIR := $(CTR_INSTALL_ROOT)/components +CTR_INSTALL_ADDINS := $(CTR_INSTALL_ROOT)/add-ins + + +#---------------------------------------------------------------------------- +# PRIVATE FLAGS +# +-include $(CTR_BUILDTOOLSDIR)/_privatedefs +-include $(CTR_BUILDTOOLSDIR)/@privatedefs + + +#---------------------------------------------------------------------------- +# Load add-ins' commondefs +# +-include $(CTR_BUILDTOOLSDIR)/commondefs.add-ins.* + + +#---------------------------------------------------------------------------- +# DEFAULT TARGET +# +ifdef CTR_UTEST +default all: utest +else +default all: build +endif + +#---------------------------------------------------------------------------- +endif # CTRSDK_COMMONDEFS_ +#----- End of commondefs ----- diff --git a/trunk/build/buildtools/commondefs.add-ins.utest b/trunk/build/buildtools/commondefs.add-ins.utest new file mode 100644 index 0000000..331703c --- /dev/null +++ b/trunk/build/buildtools/commondefs.add-ins.utest @@ -0,0 +1,41 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrSDK - UnitTest Tool +# File: commondefs.add-ins.utest +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded insructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +# +# UNIT TEST on ARM11 +# +ifeq ($(CODEGEN_PROC),ARM11) + +ELIBRARIES += libutest$(CTR_LIBSUFFIX).a + +MAKE_UTEST_MAIN = $(CTR_TOOLSDIR)/bin/make_utest_main__ +UTEST_MAIN_SRC = $(OBJDIR)/utest_main__.c +UTEST_MAIN_BIN = utest_main__.srl + +ifdef UTEST_CHECKASSERT +MACRO_FLAGS += -DSDK_CHECKASSERT +endif + +# +# UNIT TEST on ARM9 +# +else # ($(CODEGEN_PROC),ARM9) +# Not support unit test on ARM9 + +endif + +#===== End of commondefs.add-ins.utest ===== diff --git a/trunk/build/buildtools/commondefs.cctype.CW b/trunk/build/buildtools/commondefs.cctype.CW new file mode 100644 index 0000000..9911550 --- /dev/null +++ b/trunk/build/buildtools/commondefs.cctype.CW @@ -0,0 +1,510 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrSDK - buildtools - compiler dependant settings for CW +# File: commondefs.cctype.CW +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +EMPTY ?= +SPACE ?= $(EMPTY) $(EMPTY) + +#---------------------------------------------------------------------------- +CTR_STD_PCHDR ?= True + +#---------------------------------------------------------------------------- +CWFOLDER_IRIS ?= C:/Program Files/Metrowerks/CW for NINTENDO DS V1.2 +CWFOLDER_CTR ?= $(CWFOLDER_IRIS) +LM_LICENSE_FILE := $(subst /,\,$(CWFOLDER_CTR))\license.dat +CW_ROOT := $(subst $(SPACE),\ ,$(subst \,/,$(CWFOLDER_CTR))) +CW_BINDIR := $(CW_ROOT)/ARM_Tools/Command_Line_Tools +CW_ARMDIR := $(CW_ROOT)/ARM_EABI_Support + +#---------------------------------------------------------------------------- +SDK_VERINFO_CW_CC := $(CTR_BUILDTOOLSDIR)/verinfo.cw.cc +SDK_VERINFO_CW_LD := $(CTR_BUILDTOOLSDIR)/verinfo.cw.ld + +ifeq ($(MAKECMDGOALS),do-build) + +-include $(SDK_VERINFO_CW_CC) $(SDK_VERINFO_CW_LD) +#--------CW2.0beta2 以降のバージョンへの対応 +ifndef SDK_CW_BUILD_VERSION_CC +#--------SDK_CW_BUILD_VERSION_CCが定義されていない場合makeでverinfoを作成 +MAKE_VERINFO := $(shell make make-verinfo) +-include $(SDK_VERINFO_CW_CC) $(SDK_VERINFO_CW_LD) +endif + +ifeq ($(shell expr "$(SDK_CW_BUILD_VERSION_CC)" ">=" 3.0),1) +CW_MAJOR_VER ?= 2 +endif +# "__declspec(force_export)" support +ifeq ($(shell expr "$(SDK_CW_BUILD_VERSION_CC)" ">=" 3.0),1) +SDK_CW_FORCE_EXPORT_SUPPORT := yes +endif +endif +CW_MAJOR_VER ?= 1 + +######## IRIS V0.2 Hotfix 1 +######## CTR V0.3 +#CW_AVOID_STRB := -avoid_strb all,noerr +# +######## CTR V0.4 or other +CW_AVOID_STRB := -avoid_byte strb -warn_byte none +#CW_AVOID_STRB := -avoid_byte strb -warn_byte all +# + +#---------------------------------------------------------------------------- + +MWCC := $(CW_BINDIR)/mwccarm.exe +MWAS := $(CW_BINDIR)/mwasmarm.exe +MWLD := $(CW_BINDIR)/mwldarm.exe +MWAR := $(MWLD) + +CC := $(MWCC) +AS := $(MWAS) +LD := $(MWLD) +AR := $(MWAR) + +ELFTOBIN := $(CW_BINDIR)/elftobin.exe +ELFTOBIN_TYPE := $(CTR_PLATFORM)$(CODEGEN_ARCH)/$(CTR_BUILD_DIR) +ELFTOBIN_ARM11 ?= $(CTR_COMPONENTSDIR)/printserver/$(CTR_BUILDTYPE_ARM11)/printserver.nef +ELFTOBIN_ARM9 ?= $(CTR_COMPONENTSDIR)/ferret/$(CTR_BUILDTYPE_ARM9)/ferret.nef +ELFTOBIN_ROMHEADER ?= $(CTR_TOOLSDIR)/elftobin/romHeader.bin + +#---------------------------------------------------------------------------- +# Workaround flags +# SDK_CW_WARNOFF_SAFESTRB : use code32.h to wipe warning STRB out +# SDK_CW_WA_OPT4 : workaround for -O4 +# SDK_CW_WA_CONSTPOOLS : workaround for CW 'ConstantPools.c'line: 346 +# SDK_CW_WA_OPT_BLX : workaround for blxeq,blxne with opt>=2 +# SDK_CW_WA_LIBCXX : workaround for 'C++' libname in lcf +# + +#--- flags --- +ifeq ($(CTR_PLATFORM),TEG) +SDK_CW_WARNOFF_SAFESTRB := yes +else +SDK_CW_WARNOFF_SAFESTRB := +endif + +######## IRIS V0.2 Hotfix 1 +######## CTR V0.3 +######## CTR V0.4.1 +#SDK_CW_WA_OPT4 := yes +#SDK_CW_WA_CONSTPOOLS := yes +#SDK_CW_WA_OPT_BLX := yes +######## CTR V0.5 +######## CTR V0.5 + HotFix1 +######## CTR V0.6 +#SDK_CW_WA_LIBCXX := yes + +#----------------------------------- +# +ifdef SDK_CW_WA_OPT_BLX +ifdef CTR_BLXCHECKED +# workaround by pragma +MACRO_FLAGS += -DSDK_CW_WA_OPT_BLX +else +# workaround by option +SDK_CW_AVOID_ARM_ARCH5 := yes +endif +endif + +ifdef SDK_CW_WARNOFF_SAFESTRB +MACRO_FLAGS += -DSDK_CW_WARNOFF_SAFESTRB +endif + +ifdef SDK_CW_WA_OPT4 +ifeq ($(CTR_CODEGEN),ARM) +ifneq ($(CTR_BUILD_TYPE),DEBUG) +MACRO_FLAGS += -DSDK_CW_WA_OPT4 +endif +endif +endif + +ifdef SDK_CW_WA_CONSTPOOLS +ifeq ($(CTR_CODEGEN),THUMB) +ifneq ($(CTR_BUILD_TYPE),DEBUG) +MACRO_FLAGS += -DSDK_CW_WA_CONSTPOOLS +endif +endif +endif + +ifdef SDK_CW_FORCE_EXPORT_SUPPORT +MACRO_FLAGS += -DSDK_CW_FORCE_EXPORT_SUPPORT +endif + +#---------------------------------------------------------------------------- +# SDK small build + +ifdef SDK_SMALL_BUILD +MACRO_FLAGS += -DSDK_SMALL_BUILD +endif + +#---------------------------------------------------------------------------- +# Workaround flags +# SDK_TEG_WA_VBLANK : workaround TEG vblank problems +# + +ifeq ($(CTR_PLATFORM),TEG) +MACRO_FLAGS += -DSDK_TEG_WA_VBLANK +endif + + +#---------------------------------------------------------------------------- +######## IRIS V0.2 Hotfix 1 +######## CTR V0.3 +######## CTR V0.4 +#CW_LIBNAME_RULE_A := ARM +#CW_LIBNAME_RULE_T := Thumb +#CW_LIBNAME_RULE_AI := ARM_i +#CW_LIBNAME_RULE_RA := ARM_Runtime +#CW_LIBNAME_RULE_RT := Thumb_Runtime +#CW_LIBNAME_RULE_RAI := ARM_Runtime_i +######## CTR V0.5 or other +CW_LIBNAME_RULE_A := CTR_A +CW_LIBNAME_RULE_T := CTR_T +CW_LIBNAME_RULE_AI := CTR_Ai +CW_LIBNAME_RULE_RA := CTR_Runtime_A +CW_LIBNAME_RULE_RT := CTR_Runtime_T +CW_LIBNAME_RULE_RAI := CTR_Runtime_Ai +# + +CW_INCDIRS = $(CW_ARMDIR)/msl/MSL_C/MSL_ARM/Include \ + $(CW_ARMDIR)/msl/MSL_C/MSL_Common/Include \ + $(CW_ARMDIR)/msl/MSL_C/MSL_Common_Embedded/Math/Include \ + $(CW_ARMDIR)/msl/MSL_C++/MSL_ARM/Include \ + $(CW_ARMDIR)/msl/MSL_C++/MSL_Common/Include \ + $(CW_ARMDIR)/msl/MSL_Extras/MSL_Common/Include \ + $(CW_ARMDIR)/Profiler/include +#--------CW2.0beta2 以降のバージョンではRuntimeのディレクトリが変更されたため +ifeq ($(CW_MAJOR_VER),2) +CW_INCDIRS += $(CW_ARMDIR)/msl/MSL_Extras/MSL_ARM/Include +endif + +CW_CXX = $(if $(SDK_CW_WA_LIBCXX),CXX,CPP) +CW_LIBCXX_DIR = $(if $(SDK_CW_WA_LIBCXX),$(ROOT)/lib/CodeWarrior,$(CW_ARMDIR)/msl/MSL_C++/MSL_ARM/Lib) +#--------CW2.0beta2 以降のバージョンではRuntimeのディレクトリが変更されたため +ifeq ($(CW_MAJOR_VER),2) +CW_LIBDIRS ?= $(CW_ARMDIR)/msl/MSL_C/MSL_ARM/Lib \ + $(CW_LIBCXX_DIR) \ + $(CW_ARMDIR)/msl/MSL_Extras/MSL_ARM/Lib \ + $(CW_ARMDIR)/Runtime/Runtime_ARM/Runtime_CTR/Lib \ + $(CW_ARMDIR)/Mathlib/lib +endif +CW_LIBDIRS ?= $(CW_ARMDIR)/msl/MSL_C/MSL_ARM/Lib \ + $(CW_LIBCXX_DIR) \ + $(CW_ARMDIR)/msl/MSL_Extras/MSL_ARM/Lib \ + $(CW_ARMDIR)/Runtime/Lib \ + $(CW_ARMDIR)/Mathlib/lib + +ifeq ($(CODEGEN_PROC)-$(CTR_PLATFORM),ARM9-TEG) +CW_SUFFIX = _LE_strb.a +else +CW_SUFFIX = _LE.a +endif + +ifeq ($(CODEGEN_PROC),ARM9) +CW_LIBFP ?= FP_fastI_v5t_LE.a +# CW_LIBFP ?= FP_fixedI_v5t_LE.a +# CW_LIBFP ?= FP_flush0_v5t_LE.a +# CW_LIBFP ?= FP_fullI_v5t_LE.a +else +CW_LIBFP ?= FP_fastI_v4t_LE.a +# CW_LIBFP ?= FP_fixedI_v4t_LE.a +# CW_LIBFP ?= FP_flush0_v4t_LE.a +# CW_LIBFP ?= FP_fullI_v4t_LE.a +endif + +CW_LIBCXX_ARM = MSL_$(CW_CXX)_$(CW_LIBNAME_RULE_AI)$(CW_SUFFIX) + +CW_LIBS_ARM = MSL_C_$(CW_LIBNAME_RULE_AI)$(CW_SUFFIX) \ + MSL_Extras_$(CW_LIBNAME_RULE_AI)$(CW_SUFFIX) \ + $(CW_LIBCXX_ARM) \ + $(CW_LIBFP) \ + $(CW_LIBNAME_RULE_RAI)$(CW_SUFFIX) + +# Workaround for Byte Access: Don't use thumb libraries if ARM9-TEG +ifeq ($(CODEGEN_PROC)-$(CTR_PLATFORM),ARM9-TEG) + +CW_LIBCXX_THUMB = $(CW_LIBCXX_ARM) + +CW_LIBS_THUMB = $(CW_LIBS_ARM) + +else + +CW_LIBCXX_THUMB = MSL_$(CW_CXX)_$(CW_LIBNAME_RULE_T)_LE.a + +CW_LIBS_THUMB = MSL_C_$(CW_LIBNAME_RULE_T)_LE.a \ + MSL_Extras_$(CW_LIBNAME_RULE_T)_LE.a \ + $(CW_LIBCXX_THUMB) \ + $(CW_LIBFP) \ + $(CW_LIBNAME_RULE_RT)_LE.a +endif + +ifeq ($(CODEGEN_PROC),ARM11) +STUBS_LIBS += libstubscw$(CTR_LIBSUFFIX).a +else # ($(CODEGEN_PROC),ARM9) +STUBS_LIBS += libstubscw_sp$(CTR_LIBSUFFIX).a +endif + $(ECHO) "==== test"; + +#---------------------------------------------------------------------------- +# switch by codegen target +# CTR_PLATFORM TEG/TS +# CTR_MEMSIZE 64M/128M +# CODEGEN_PROC ARM11/ARM9 +# CODEGEN_CC ARM/THUMB +# CODEGEN_AS ARM/THUMB +# + +MACRO_FLAGS += -DSDK_$(CTR_PLATFORM) \ + -DSDK_$(CTR_MEMSIZE) \ + -DSDK_$(CODEGEN_PROC) + +MACRO_FLAGS_CC += -DSDK_CODE_$(CODEGEN_CC) +MACRO_FLAGS_AS += -DSDK_CODE_$(CODEGEN_AS) + + +#-------------------------------------- CODEGEN_PROC ARM11/ARM9 +ifeq ($(CODEGEN_PROC),ARM9) + +CCFLAGS_PROC := -proc $(if $(SDK_CW_AVOID_ARM_ARCH5),arm7tdmi,arm946e) +ASFLAGS_PROC := -proc arm5TE + +ifeq ($(CTR_PLATFORM),TEG) +CCFLAGS_PROC += $(CW_AVOID_STRB) +endif + +else # ($(CODEGEN_PROC),ARM7) + +CCFLAGS_PROC := -proc arm7tdmi +ASFLAGS_PROC := -proc arm4T + +endif # ($(CODEGEN_PROC)) + +#-------------------------------------- CTR_CODEGEN ARM/THUMB + +ifeq ($(CTR_CODEGEN),ARM) +CW_LIBS ?= $(CW_LIBS_ARM) +else # ($(CTR_CODEGEN),THUMB) +CW_LIBS ?= $(CW_LIBS_THUMB) +endif + + +#-------------------------------------- CODEGEN_CC ARM/THUMB + +ifeq ($(CODEGEN_CC),THUMB) +CCFLAGS_ISET := -thumb +else +CCFLAGS_ISET := -nothumb +endif + + +#-------------------------------------- CODEGEN_AS ARM/THUMB + +ifeq ($(CODEGEN_AS),THUMB) +ASFLAGS_ISET := -16 +else +ASFLAGS_ISET := -32 +endif + + +CCFLAGS_ARCH ?= $(CCFLAGS_PROC) $(CCFLAGS_ISET) -nopic -nopid -interworking +ASFLAGS_ARCH ?= $(ASFLAGS_PROC) $(ASFLAGS_ISET) +LDFLAGS_ARCH ?= $(CCFLAGS_PROC) $(CCFLAGS_ISET) -nopic -nopid -interworking +ARFLAGS_ARCH ?= + +#---------------------------------------------------------------------------- +# standard includes/libraries for CodeWarrior +# + +export MWCIncludes := $(subst \;, ,$(subst $(SPACE),;,$(CW_INCDIRS))) +export MWLibraries := $(subst \;, ,$(subst $(SPACE),;,$(CW_LIBDIRS))) +export MWLibraryFiles := $(subst \;, ,$(subst $(SPACE),;,$(CW_LIBS))) + +#---------------------------------------------------------------------------- +# switch by C Compiler CW/SNC +# + +MACRO_FLAGS += -DSDK_$(CTR_CCTYPE) + + +#---------------------------------------------------------------------------- +# switch by DEBUG/RELEASE/FINALROM +# + +MACRO_FLAGS += -DSDK_$(CTR_BUILD_TYPE) + +ifeq ($(CTR_BUILD_TYPE),DEBUG) + +CCFLAGS_OPT ?= -O0 -inline off +ASFLAGS_OPT ?= +LDFLAGS_OPT ?= +ARFLAGS_OPT ?= + +else + +CCFLAGS_OPT_O_ = -O4 -inline on,noauto + +ifeq ($(CODEGEN_PROC),ARM11) +CCFLAGS_OPT_O_ += -opt speed +else +CCFLAGS_OPT_O_ += -opt space +endif + +ifeq ($(CTR_BUILD_TYPE),FINALROM) +CCFLAGS_OPT ?= $(CCFLAGS_OPT_O_) +ASFLAGS_OPT ?= +LDFLAGS_OPT ?= +ARFLAGS_OPT ?= +else # ($(CTR_BUILD_TYPE),RELEASE) # (default) +CCFLAGS_OPT ?= $(CCFLAGS_OPT_O_) +ASFLAGS_OPT ?= +LDFLAGS_OPT ?= +ARFLAGS_OPT ?= +endif + +endif + +ifndef CTR_NO_OPT_G +CCFLAGS_OPT += -g +LDFLAGS_OPT += -g +endif + +#--------CW2.0beta2 以降のバージョンではサイズ増大問題回避のため -ipa file オプションが必須 +ifeq ($(CW_MAJOR_VER),2) +CCFLAGS_OPT += -ipa file +endif + + +#---------------------------------------------------------------------------- +# switch for code profiling +# + +ifdef CTR_PROFILE +CCFLAGS_OPT += -profile +endif + +ifdef CTR_PROFILE_TYPE +CCFLAGS_OPT += -DSDK_PROFILE_$(CTR_PROFILE_TYPE) +endif + + +#---------------------------------------------------------------------------- +# switch for anti-thread policy +# + +ifdef CTR_NO_THREAD +MACRO_FLAGS += -DSDK_NO_THREAD +endif + + +#---------------------------------------------------------------------------- +# switch for AUTOTEST/UNITTEST +# +ifdef CTR_AUTOTEST +MACRO_FLAGS += -DSDK_AUTOTEST +endif +ifdef CTR_UTEST +MACRO_FLAGS += -DSDK_UTEST +endif + +#---------------------------------------------------------------------------- +# Switch for using system call when SVC_WaitVBlankIntr +# +ifdef CTR_SVC_WAITVBLANK_COMPATIBLE +MACRO_FLAGS += -DSDK_SVC_WAITVBLANK_COMPATIBLE +endif + +#---------------------------------------------------------------------------- +# Switch for automatic PrintServer +# +ifdef CTR_ENABLE_ARM9_PRINT +MACRO_FLAGS += -DSDK_ENABLE_ARM9_PRINT +endif + + +#---------------------------------------------------------------------------- +# switch for TS board +# +# Default value of CTR_TS_VERSION is defined in +# +# CTR_TS_VERSION = [0/100/200] +# +# 0 : Prototype breadboard ~ ISD-BOX Ver.C +# 100 : ISD-BOX Ver.D +# 200 : ISD-BOX Ver.E +# +# +ifdef CTR_TS_VERSION +MACRO_FLAGS += -DSDK_TS_VERSION=$(CTR_TS_VERSION) +endif + + +#---------------------------------------------------------------------------- +# my macro flags +# +MACRO_FLAGS += $(LMACRO_FLAGS) + + +#---------------------------------------------------------------------------- +CCFLAGS_WARNING_FULL = all,cmdline,illpragmas,emptydecl,possible,unusedarg,unusedvar,unused,extracomma,pedantic,hidevirtual,implicitconv,impl_int2float,impl_float2int,impl_signedunsigned,notinlined,largeargs,structclass,padding,notused,missingreturn,unusedexpr,ptrintconv,anyptrintconv,undefmacro,filecaps,sysfilecaps,tokenpasting + +CCFLAGS_MSGSTYLE ?= -msgstyle std + +ifdef CTR_WARNING_STRICT +CCFLAGS_WARNING ?= -w $(CCFLAGS_WARNING_FULL) +else +CCFLAGS_WARNING ?= -w all +endif +LDFLAGS_WARNING ?= -w on +ARFLAGS_WARNING ?= -w on + +ifeq ($(CTRSDK_LANG),en) +CCFLAGS_ENCODING ?= -enc ascii +else +CCFLAGS_ENCODING ?= -enc SJIS +endif +CCFLAGS_CHARTYPE ?= -char signed + +CCFLAGS_MISC = $(CCFLAGS_MSGSTYLE) $(CCFLAGS_WARNING) $(CCFLAGS_ENCODING) $(CCFLAGS_CHARTYPE) +ASFLAGS_MISC = $(CCFLAGS_MSGSTYLE) +LDFLAGS_MISC = $(CCFLAGS_MSGSTYLE) $(LDFLAGS_WARNING) +ARFLAGS_MISC = $(CCFLAGS_MSGSTYLE) $(ARFLAGS_WARNING) + + +#---------------------------------------------------------------------------- + +CCFLAGS_SYS ?= -stdinc -enum int -stdkeywords off -Cpp_exceptions off +ASFLAGS_SYS ?= -nostdinc -DSDK_ASM +LDFLAGS_SYS ?= -stdlib -map closure -main _start +ARFLAGS_SYS ?= -library + + +CCFLAGS = -lang c $(CCFLAGS_ARCH) $(CCFLAGS_OPT) $(CCFLAGS_MISC) \ + $(CCFLAGS_SYS) $(MACRO_FLAGS) $(MACRO_FLAGS_CC) + +CXXFLAGS = -lang c++ $(CCFLAGS_ARCH) $(CCFLAGS_OPT) $(CCFLAGS_MISC) \ + $(CCFLAGS_SYS) $(MACRO_FLAGS) $(MACRO_FLAGS_CC) + +ASFLAGS = $(ASFLAGS_ARCH) $(ASFLAGS_OPT) $(ASFLAGS_MISC) \ + $(ASFLAGS_SYS) $(MACRO_FLAGS) $(MACRO_FLAGS_AS) + +LDFLAGS = $(LDFLAGS_ARCH) $(LDFLAGS_OPT) $(LDFLAGS_MISC) \ + $(LDFLAGS_SYS) + +ARFLAGS = $(ARFLAGS_ARCH) $(ARFLAGS_OPT) $(ARFLAGS_MISC) \ + $(ARFLAGS_SYS) + + +#----- End of commondefs.cctype.CW ----- diff --git a/trunk/build/buildtools/commondefs.cctype.RVCT b/trunk/build/buildtools/commondefs.cctype.RVCT new file mode 100644 index 0000000..985bf39 --- /dev/null +++ b/trunk/build/buildtools/commondefs.cctype.RVCT @@ -0,0 +1,321 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrFirm - buildtools - compiler dependant settings for RCVT +# File: commondefs.cctype.RVCT +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +EMPTY ?= +SPACE ?= $(EMPTY) $(EMPTY) + + +#---------------------------------------------------------------------------- +RVCT_PATH ?= $(ARMROOT)\RVCT +RVCT_ROOT = $(patsubst %/,%,$(subst $(SPACE),\ ,$(subst \,/,$(RVCT_PATH)))) +RVCT_BINDIR = $(patsubst %/,%,$(subst $(SPACE),\ ,$(subst \,/,$(RVCT30BIN)))) + + +#---------------------------------------------------------------------------- +RVCTCC := $(RVCT_BINDIR)/armcc.exe +RVCTAS := $(RVCT_BINDIR)/armasm.exe +RVCTLD := $(RVCT_BINDIR)/armlink.exe +RVCTAR := $(RVCT_BINDIR)/armar.exe +FROMELF := $(RVCT_BINDIR)/fromelf.exe +S3TOEXO := $(BROM_TOOLSDIR)/s3toexo/s3toexo.pl + +CC := $(RVCTCC) +AS := $(RVCTAS) +LD := $(RVCTLD) +AR := $(RVCTAR) + + +#---------------------------------------------------------------------------- +ifeq ($(EXO_PLATFORM),DSTEG) +EXO_SBIN_SIZE ?= 0x00008400 +else +EXO_SBIN_SIZE ?= 0x00010000 +endif + +ifeq ($(CODEGEN_PROC),ARM11) +EXO_OFFSET ?= 0x00000000 +else # ($(CODEGEN_PROC),ARM9) +EXO_OFFSET ?= EXO_SBIN_SIZE +endif + +EXO_FLAGS += --base $(EXO_OFFSET) + +#---------------------------------------------------------------------------- +# SDK small build +# +ifdef SDK_SMALL_BUILD +MACRO_FLAGS += -DSDK_SMALL_BUILD +endif + + +#---------------------------------------------------------------------------- +RVCT_INCDIRS = $(patsubst %/,%,$(subst $(SPACE),\ ,$(subst \,/,$(RVCT30INC)))) +RVCT_LIBDIRS = $(patsubst %/,%,$(subst $(SPACE),\ ,$(subst \,/,$(RVCT30LIB)))) + + +#---------------------------------------------------------------------------- +# switch by codegen target +# CTR_PLATFORM TEG/TS +# CTR_MEMSIZE 64M/128M +# CODEGEN_PROC ARM11/ARM9 +# CODEGEN_CC ARM/THUMB +# +MACRO_FLAGS += -DSDK_$(CTR_PLATFORM) \ + -DSDK_$(CTR_MEMSIZE) \ + -DSDK_$(CODEGEN_PROC) + +MACRO_FLAGS_CC += -DSDK_CODE_$(CODEGEN_CC) + + +#-------------------------------------- CODEGEN_PROC ARM11/ARM9/ARM7 +ifeq ($(CODEGEN_PROC),ARM11) +CCFLAGS_PROC := --cpu ARM11 +ASFLAGS_PROC := --cpu ARM11 +else # ($(CODEGEN_PROC),ARM9) +ifeq ($(CODEGEN_PROC),ARM9) +CCFLAGS_PROC := --cpu ARM946E-S +ASFLAGS_PROC := --cpu ARM946E-S +else # ($(CODEGEN_PROC),ARM7) +CCFLAGS_PROC := --cpu ARM7TDMI +ASFLAGS_PROC := --cpu ARM7TDMI +endif # ($(CODEGEN_PROC)) +endif # ($(CODEGEN_PROC)) + + +#-------------------------------------- CTR_CODEGEN ARM/THUMB +ifeq ($(CTR_CODEGEN),ARM) +RVCT_LIBS ?= $(RVCT_LIBS_ARM) +else # ($(CTR_CODEGEN),THUMB) +RVCT_LIBS ?= $(RVCT_LIBS_THUMB) +endif + + +#-------------------------------------- CODEGEN_CC ARM/THUMB +ifeq ($(CODEGEN_CC),THUMB) +CCFLAGS_ISET := --thumb +else +CCFLAGS_ISET := +endif + + +#-------------------------------------- CODEGEN_AS ARM/THUMB +ifeq ($(CODEGEN_AS),THUMB) +ASFLAGS_ISET := +else +ASFLAGS_ISET := +endif + +CCFLAGS_ARCH ?= $(CCFLAGS_PROC) $(CCFLAGS_ISET) +ASFLAGS_ARCH ?= $(ASFLAGS_PROC) $(ASFLAGS_ISET) +LDFLAGS_ARCH ?= +ARFLAGS_ARCH ?= + + +#---------------------------------------------------------------------------- +# switch by C Compiler CW/SNC/RVCT +# + +MACRO_FLAGS += -DSDK_$(CTR_CCTYPE) # -D__RVCT__ + + +#---------------------------------------------------------------------------- +# switch by DEBUG/RELEASE/FINALROM +# + +MACRO_FLAGS += -DSDK_$(CTR_BUILD_TYPE) -DBROM_BUILDTYPE_ARM11=$(BROM_BUILDTYPE_ARM11) -DBROM_BUILDTYPE_ARM9=$(BROM_BUILDTYPE_ARM9) + +ifeq ($(CTR_BUILD_TYPE),DEBUG) +CCFLAGS_OPT_O_ = -O0 +CCFLAGS_OPT_G_ = -g +else +ifeq ($(CTR_BUILD_TYPE),FINALROM) +CCFLAGS_OPT_O_ = -O3 -Ospace +CCFLAGS_OPT_G_ = +else # ($(CTR_BUILD_TYPE),RELEASE) # (default) +CCFLAGS_OPT_O_ = -O3 -Ospace +CCFLAGS_OPT_G_ = +endif +endif + +CCFLAGS_OPT ?= $(CCFLAGS_OPT_G_) $(CCFLAGS_OPT_O_) +ASFLAGS_OPT ?= +LDFLAGS_OPT ?= +ARFLAGS_OPT ?= + + +#---------------------------------------------------------------------------- +# switch for anti-thread policy +# +ifdef CTR_NO_THREAD +MACRO_FLAGS += -DSDK_NO_THREAD +endif + + +#---------------------------------------------------------------------------- +# switch for AUTOTEST/UNITTEST +# +ifdef CTR_AUTOTEST +MACRO_FLAGS += -DSDK_AUTOTEST +endif +ifdef CTR_UTEST +MACRO_FLAGS += -DSDK_UTEST +endif + + +#---------------------------------------------------------------------------- +# switch for TS board +# +# Default value of CTR_TS_VERSION is defined in +# +# CTR_TS_VERSION = [0/100/200] +# +# 0 : Prototype breadboard ~ ISD-BOX Ver.C +# 100 : ISD-BOX Ver.D +# 200 : ISD-BOX Ver.E +# +ifdef CTR_TS_VERSION +MACRO_FLAGS += -DSDK_TS_VERSION=$(CTR_TS_VERSION) +endif + + +#---------------------------------------------------------------------------- +# switch for anti-thread policy +# +ifdef BROM_DEF_LINK_SCATLD +MACRO_FLAGS += -DBROM_DEF_LINK_SCATLD +endif + + +#---------------------------------------------------------------------------- +# my macro flags +# +MACRO_FLAGS += $(LMACRO_FLAGS) + + +#---------------------------------------------------------------------------- +# Demote the following compiler warnings to remarks: +# +# 66: enumeration value is out of "int" range +# 108: signed bit field of length 1 +# 177: variable was declared but never referenced +# 236: controlling expression is constant +# 1256: "unsigned char" would have been promoted to "int" +# when passed through the ellipsis parameter; use the latter type instead +#A1581W: Added 2 bytes of padding at address 0x3e2 +T_CFLAGS_WARN += --diag_remark 236,177 +T_CFLAGS_WARN += --diag_suppress 66,108,1256,A1581W + +# Promote the following compiler warnings to errors: +# +# 61: integer operation result is out of range +# 68: integer conversion resulted in a change of sign +# 88: assignment in condition +# 111: statement is unreachable +# 174: expression has no effect +# 188: enumerated type mixed with another type +# 223: function "" declared implicitly +# 550: variable was set but never used +# 3017: may be used before being set +T_CFLAGS_WARN += --diag_error 68,88,111,174,188,223,3017 + +# Demote the following linker warnings to suppresses: +# +# L6314W: No section matches pattern +# L6329W: Pattern * only matches removed unused sections +T_LDFLAGS_WARN += --diag_suppress L6314W,L6329W + +ifdef BROM_PROMGEN +# L6305W: Image does not have an entry point. (Not specified or not set due to multiple choices.) +T_LDFLAGS_WARN += --diag_suppress L6305W +endif # BROM_PROMGEN + +# Promote the following linker warnings to errors: +# +# L6332W: Undefined symbol +T_LDFLAGS_WARN += --diag_error L6332W + + +CCFLAGS_WARNING ?= $(T_CFLAGS_WARN) +LDFLAGS_WARNING ?= $(T_LDFLAGS_WARN) +ARFLAGS_WARNING ?= + +ifeq ($(CTRSDK_LANG),en) +CCFLAGS_ENCODING ?= +else +CCFLAGS_ENCODING ?= --multibyte-chars +endif +CCFLAGS_CHARTYPE ?= + +CCFLAGS_MISC = $(CCFLAGS_MSGSTYLE) $(CCFLAGS_WARNING) $(CCFLAGS_ENCODING) $(CCFLAGS_CHARTYPE) +ASFLAGS_MISC = $(CCFLAGS_MSGSTYLE) +LDFLAGS_MISC = $(CCFLAGS_MSGSTYLE) $(LDFLAGS_WARNING) +ARFLAGS_MISC = $(CCFLAGS_MSGSTYLE) $(ARFLAGS_WARNING) + + +#---------------------------------------------------------------------------- +CCFLAGS_SYS ?= \ + --no_unaligned_access \ + --no_exceptions \ + --no_exceptions_unwind \ + --gnu \ + --debug \ + --split_sections \ + --apcs /interwork \ + -Ono_ldrd -Ono_memcpy --dwarf2 \ + +T_ENTRYPOINT = _start +LDFLAGS_SYS ?= \ + --callgraph --no_locals --map --mangled --symbols \ + --info=common,sizes,veneers,totals \ + --list=$(BINDIR)/realview.map \ + --locals \ + --scanlib \ + --no_exceptions \ + --exceptions_tables=nocreate \ + --datacompressor off \ + --remove \ + --pad 0xFF \ + --scatter $(LCFILE) \ + +ifndef BROM_PROMGEN +LDFLAGS_SYS += \ + --entry $(T_ENTRYPOINT) --unresolved=$(T_ENTRYPOINT) \ + +endif # BROM_PROMGEN + +# --keep '*crt0.*o(.ARM.exidx)' \ +# --info=unused \ + +ARFLAGS_SYS ?= -rcuT + +CCFLAGS = $(CCFLAGS_ARCH) $(CCFLAGS_OPT) $(CCFLAGS_MISC) \ + $(CCFLAGS_SYS) $(MACRO_FLAGS) $(MACRO_FLAGS_CC) + +CXXFLAGS = $(CCFLAGS_ARCH) $(CCFLAGS_OPT) $(CCFLAGS_MISC) \ + $(CCFLAGS_SYS) $(MACRO_FLAGS) $(MACRO_FLAGS_CC) + +ASFLAGS = $(ASFLAGS_ARCH) $(ASFLAGS_OPT) $(ASFLAGS_MISC) +# $(ASFLAGS_SYS) $(MACRO_FLAGS) $(MACRO_FLAGS_AS) + +LDFLAGS = $(LDFLAGS_ARCH) $(LDFLAGS_OPT) $(LDFLAGS_MISC) \ + $(LDFLAGS_SYS) + +ARFLAGS = $(ARFLAGS_ARCH) $(ARFLAGS_OPT) $(ARFLAGS_MISC) \ + $(ARFLAGS_SYS) + + +#----- End of commondefs.cctype.RVCT ----- diff --git a/trunk/build/buildtools/commondefs.cygpath b/trunk/build/buildtools/commondefs.cygpath new file mode 100644 index 0000000..f4f33ae --- /dev/null +++ b/trunk/build/buildtools/commondefs.cygpath @@ -0,0 +1,152 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrSDK +# File: commondefs +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Date:: 2008-09-29#$ +# $Rev: 8757 $ +# $Author: adachi_hiroaki $ +#---------------------------------------------------------------------------- +ifndef CTRFIRM_COMMONDEFS_CYGPATH_ +CTRFIRM_COMMONDEFS_CYGPATH_ = TRUE + +#---------------------------------------------------------------- +# +# cygpath +# + +CYGPATH ?= cygpath + +# 高速 cygpath は標準では無効 (make 3.80 では eval 関数に不具合があり動作しないため) +CYGPATH_NOCMD ?= FALSE + +# 自動判別する場合は上の定義を消す(動作未確認) +#ifndef CYGPATH_NOCMD +# +#MAKE_VERSION := $(shell $(MAKE) -v | $(HEAD) -1 | $(AWK) '{print $3}') +# +#ifndef MSYSTEM +# +#ifeq ($(shell(expr "$(MAKE_VERSION)" ">=" "3.81")),1) +#CYGPATH_NOCMD=TRUE +#else # MAKE_VERSION +#CYGPATH_NOCMD=FALSE +#endif # MAKE_VERSION +# +#endif # MSYSTEM +# +#endif # CYGPATH_NOCMD + + +# cygdrive path prefix を取得 + +ifeq ($(CYGPATH_MOUNTPOINT),) +CYGPATH_MOUNTPOINT := $(patsubst %/,%,$(dir $(shell $(CYGPATH) -u c:/))) +endif # CYGPATH_MOUNTPOINT + +ifeq ($(CYGPATH_NOCMD),TRUE) + +ifeq ($(CYGPATH_DRIVELIST),) +# 安全 +CYGPATH_DRIVELIST_ALL = $(shell DRIVES=`$(MOUNT) | $(GREP) 'type user' | $(CUT) -c1 | tr '\n' ' '` \ + && echo $${DRIVES} `echo $${DRIVES} | $(TR) '[a-z]' '[A-Z]'`) + +# 最小限で速い +CYGPATH_DRIVELIST_FAST = $(shell $(CYGPATH) -aw '$(CTRSDK_ROOT)c' \ + '$(CWFOLDER_CTR)c' \ + '$(CTRSYSTEM_ROOT)c' \ + '$(IS_CTR_DIR)c' '$(IS_TWL_DIR)c' \ + | $(CUT) -c1) + +CYGPATH_DRIVELIST := $(sort $(CYGPATH_DRIVELIST_FAST)) +#CYGPATH_DRIVELIST := $(sort $(CYGPATH_DRIVELIST_ALL)) +endif # CYGPATH_DRIVELIST + + +define cygpathm +$(strip $(eval VALUE=$(1))$(foreach DRIVE,$(CYGPATH_DRIVELIST),$(eval VALUE:=$$(patsubst $(CYGPATH_MOUNTPOINT)/$(DRIVE)/%,$(DRIVE):/%,$$(subst \,/,$$(VALUE)))))$(VALUE)) +endef # cygpathm + +define cygpathu +$(strip $(eval VALUE:=$(1))$(foreach DRIVE,$(CYGPATH_DRIVELIST),$(eval VALUE:=$$(patsubst $(DRIVE):/%,$(CYGPATH_MOUNTPOINT)/$(DRIVE)/%,$$(subst \,/,$$(VALUE)))))$(VALUE)) +endef # cygpathu + +define cygpathm_multi +$(foreach pathvar,$(1),$(call cygpathm,$(pathvar))) +endef # cygpathm_multi + +define cygpathu_multi +$(foreach pathvar,$(1),$(call cygpathu,$(pathvar))) +endef # cygpathu_multi + +define eupath +$(subst $(SPACE),\ ,$(call cygpathu,$(subst \ , ,$(1)))) +endef # eupath + +define empath +$(subst $(SPACE),\ ,$(call cygpathm,$(subst \ , ,$(1)))) +endef # empath + +else # CYGPATH_NOCMD + +define empath +$(subst $(SPACE),\ ,$(shell $(CYGPATH) -m $(subst \,\\,$(subst \ , ,$(1))))) +endef # empath + +ifdef MSYSTEM + +define eupath +$(call empath,$(1)) +endef #eupath + +define cygpathu +$(shell cygpath -m $(subst \,\\,$(subst \ , ,$(1)))) +endef + +else # MSYSTEM + +define eupath +$(subst $(SPACE),\ ,$(shell $(CYGPATH) -u $(subst \,\\,$(subst \ , ,$(1))))) +endef + +define cygpathu +$(shell cygpath -u $(subst \,\\,$(subst \ , ,$(1)))) +endef + +endif # MSYSTEM + +define cygpathm +$(shell cygpath -m $(subst \,\\,$(subst \ , ,$(1)))) +endef + +define cygpathu_multi +$(call cygpathu,$(1)) +endef + +define cygpathm_multi +$(call cygpathm,$(1)) +endef + +endif # CYGPATH_NOCMD + +export CYGPATH_MOUNTPOINT CYGPATH_DRIVELIST CYGPATH_NOCMD + +define encode_specialchar +$(subst $(SPACE),%20,$(1)) +endef + +define decode_specialchar +$(subst %20,$(SPACE),$(1)) +endef + +#---------------------------------------------------------------------------- +endif # CTRFIRM_COMMONDEFS_CYGPATH_ +#----- End of commondefs ----- diff --git a/trunk/build/buildtools/commondefs.emtype.ISD b/trunk/build/buildtools/commondefs.emtype.ISD new file mode 100644 index 0000000..fea4461 --- /dev/null +++ b/trunk/build/buildtools/commondefs.emtype.ISD @@ -0,0 +1,61 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrSDK - buildtools - debugger dependant settings for ISDbgr +# File: commondefs.emtype.ISD +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +ifdef IS_CTR_DEBUGGER_DIR + +#---------------------------------------------------------------------------- +# Setting for IS-NITRO-EMULATOR +#---------------------------------------------------------------------------- + +EMPTY ?= +SPACE ?= $(EMPTY) $(EMPTY) +CTR_ISD_ROOT := $(patsubst %/,%,$(subst $(SPACE),\ ,$(subst \,/,$(IS_CTR_DEBUGGER_DIR)))) +CTR_ISD_ROOT_NOSPACE := $(subst \,/,$(shell cygpath -d $(CTR_ISD_ROOT))) + +#---------------------------------------------------------------------------- + +ifeq ($(CODEGEN_PROC),ARM9) + +CTR_ISD_INCDIRS := $(CTR_ISD_ROOT)/Target/include/ARM9 +CTR_ISD_LIBDIRS := $(CTR_ISD_ROOT_NOSPACE)/Target/lib/ARM9-TS + +ifeq ($(CTR_CODEGEN),ARM) +CTR_ISD_LIBS := libistdmainparm.a +else # ($(CTR_CODEGEN),THUMB) +CTR_ISD_LIBS := libistdmainpthumb.a +endif + +else # ($(CODEGEN_PROC),ARM7) + +CTR_ISD_INCDIRS := $(CTR_ISD_ROOT)/Target/include/ARM7 +CTR_ISD_LIBDIRS := $(CTR_ISD_ROOT_NOSPACE)/Target/lib/ARM7-TS + +ifeq ($(CTR_CODEGEN),ARM) +CTR_ISD_LIBS := libistdsubparm.a +else # ($(CTR_CODEGEN),THUMB) +CTR_ISD_LIBS := libistdsubpthumb.a +endif + +endif + +#---------------------------------------------------------------------------- + +else + +endif + +#----- End of commondefs.emtype.ISD ----- diff --git a/trunk/build/buildtools/modulerules b/trunk/build/buildtools/modulerules new file mode 100644 index 0000000..7599c12 --- /dev/null +++ b/trunk/build/buildtools/modulerules @@ -0,0 +1,395 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrSDK - modulerules - common rules for build system +# File: modulerules +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- +ifndef CTRSDK_MODULERULES_ + +#---------------------------------------------------------------------------- +# Implicit RULES +#---------------------------------------------------------------------------- +.SUFFIXES: # Delete all suffix rules + +ifneq ($(CTR_FORCE_BUILD),) + +VPATH = $(SRCDIR) + +SSRCFILES = $(addprefix $(OBJDIR)/,$(notdir $(SRCS))) +ASRCFILES = $(addprefix $(OBJDIR)/,$(notdir $(SRCS_AUTOLOAD))) +VSRCFILES = $(addprefix $(OBJDIR)/,$(notdir $(SRCS_OVERLAY))) + +SOBJS_CC = $(filter %.o,$(SSRCFILES:.c=.o)) +SOBJS_AS = $(filter %.o,$(SSRCFILES:.s=.o)) +SOBJS_CXX = $(filter %.o,$(SSRCFILES:.cpp=.o)) +AOBJS_CC = $(filter %.o,$(ASRCFILES:.c=.o)) +AOBJS_AS = $(filter %.o,$(ASRCFILES:.s=.o)) +AOBJS_CXX = $(filter %.o,$(ASRCFILES:.cpp=.o)) +VOBJS_CC = $(filter %.o,$(VSRCFILES:.c=.o)) +VOBJS_AS = $(filter %.o,$(VSRCFILES:.s=.o)) +VOBJS_CXX = $(filter %.o,$(VSRCFILES:.cpp=.o)) + +OBJS_CC = $(SOBJS_CC) $(AOBJS_CC) $(VOBJS_CC) +OBJS_AS = $(SOBJS_AS) $(AOBJS_AS) $(VOBJS_AS) +OBJS_CXX = $(SOBJS_CXX) $(AOBJS_CXX) $(VOBJS_CXX) +OBJS_STATIC = $(SOBJS_CC) $(SOBJS_AS) $(SOBJS_CXX) $(EXT_OBJS) +OBJS_AUTOLOAD = $(AOBJS_CC) $(AOBJS_AS) $(AOBJS_CXX) $(EXT_OBJS_AUTOLOAD) +OBJS_OVERLAY = $(VOBJS_CC) $(VOBJS_AS) $(VOBJS_CXX) $(EXT_OBJS_OVERLAY) +OBJS = $(OBJS_STATIC) $(OBJS_AUTOLOAD) $(OBJS_OVERLAY) + +-include $(CTR_BUILDTOOLSDIR)/modulerules.cctype.$(CTR_CCTYPE) + +# Common Rules + +# .bin .srl +ifdef CTR_MAKEROM +# +# MAKEROM +# + +ROM_SPEC ?= $(DEFAULT_ROM_SPEC) +MAKEROM_ARM11 ?= $(DEFAULT_MAKEROM_ARM11) +MAKEROM_ARM9 ?= $(DEFAULT_MAKEROM_ARM9) +MAKEROM_ROMROOT ?= $(DEFAULT_MAKEROM_ROMROOT) +MAKEROM_ROMFILES ?= $(DEFAULT_MAKEROM_ROMFILES) +MAKEROM_ROMSPEED ?= $(DEFAULT_MAKEROM_ROMSPEED) +MAKEROM_FLAGS ?= +MAKEROM_FLAGS += $(if $(CTR_FINALROM),,-F) + +MAKEROM_DEFS = -DCTRSDK_ROOT='$(ROOT)' \ + -DTARGET_NAME='$(TARGET_NAME)' \ + -DMAKEROM_ROMROOT='$(MAKEROM_ROMROOT)' \ + -DMAKEROM_ROMFILES='$(MAKEROM_ROMFILES)' \ + -DMAKEROM_ROMSPEED='$(MAKEROM_ROMSPEED)' \ + -DBINDIR='$(BINDIR)' \ + -DCOMPDIR='$(CTR_COMPONENTSDIR)' \ + -DCOMPTYPE11='$(CTR_BUILDTYPE_ARM11)' \ + -DCOMPTYPE9='$(CTR_BUILDTYPE_ARM9)' \ + -DPROC='$(CODEGEN_PROC)' \ + -DPLATFORM='$(CTR_PLATFORM)' \ + -DCODEGEN='$(CODEGEN_ARCH)' \ + -DBUILD='$(CTR_BUILD_DIR)' \ + -DCOMPSUFFIX9='$(COMPSUFFIX)' \ + -DCOMPSUFFIX7='' + +TARGET_ROM = $(strip $(findstring .srl,$(TARGET_BIN)) \ + $(findstring .bin,$(TARGET_BIN))) + +ifneq ($(strip $(OBJS) $(LLIBRARIES)),) # any object? +ifeq ($(CODEGEN_PROC),ARM11) +SDEPENDS_BIN = $(BINDIR)/%.nef $(MAKEROM_ARM11) +MAKEROM_DEFS += -DMAKEROM_ARM11='$(basename $@)' \ + -DMAKEROM_ARM9='$(basename $(MAKEROM_ARM9))' +else # !ARM11 +SDEPENDS_BIN = $(BINDIR)/%.nef $(MAKEROM_ARM11) +MAKEROM_DEFS += -DMAKEROM_ARM11='$(basename $(MAKEROM_ARM11))' \ + -DMAKEROM_ARM9='$(basename $@)' +endif # -ARM11 +else # !OBJS !LLIBRARIES +SDEPENDS_BIN = $(MAKEROM_ARM11) $(MAKEROM_ARM7) +MAKEROM_DEFS += -DMAKEROM_ARM11='$(basename $(MAKEROM_ARM11))' \ + -DMAKEROM_ARM9='$(basename $(MAKEROM_ARM9))' +endif # -OBJS -LLIBRARIES + +ifndef USE_MY_RULE_BIN +$(BINDIR)/%.bin $(BINDIR)/%.srl: $(SDEPENDS_BIN) $(ROM_SPEC) $(LDEPENDS_BIN) $(EDEPENDS_BIN) + $(MAKEROM) $(MAKEROM_FLAGS) $(MAKEROM_DEFS) $(ROM_SPEC) $@ +endif # -USE_MY_RULE_BIN + +$(BINDIR)/$(TARGET_SIGN_BIN): $(BINDIR)/$(TARGET_BIN) + $(CTRSDK_ROOT)/tools/bin/attachsign.exe -D $(addprefix $(BINDIR)/,$(TARGET_BIN)) + +else # !CTR_MAKEROM +# +# ELFTOBIN +# +ifndef USE_MY_RULE_BIN +ifeq ($(CODEGEN_PROC),ARM11) +$(BINDIR)/%.bin $(BINDIR)/%.srl: $(BINDIR)/%.nef $(LDEPENDS_BIN) $(EDEPENDS_BIN) + $(ELFTOBIN) $< $(ELFTOBIN_ARM7) $(ELFTOBIN_ROMHEADER) -o $@ +else # !ARM11 +$(BINDIR)/%.bin $(BINDIR)/%.srl: $(BINDIR)/%.nef $(LDEPENDS_BIN) $(EDEPENDS_BIN) + $(ELFTOBIN) $(ELFTOBIN_ARM9) $< $(ELFTOBIN_ROMHEADER) -o $@ +endif # -ARM11 +endif # -USE_MY_RULE_BIN +endif # -CTR_MAKEROM + +endif # -CTR_FORCE_BUILD + +# .bnr .bsf +%.bnr: %.bsf + $(MAKEBANNER) $(MAKEBANNER_FLAGS) $< $@ + +%.nbfc %.nbfp: %.bmp + $(NTEXCONV) -no -bg -bgb -bgnc $< >/dev/null + +#---------------------------------------------------------------------------- +# MAKE TARGETS +#---------------------------------------------------------------------------- + +.PHONY: all default build install clean clobber full super-full + +BUILDCMDS = all default build + +#---------------------------------------------------------------------------- +SUBDIR_FLAGS += $(if $(CTR_CODEGEN_ALL),CTR_CODEGEN_ALL=False) + +define MAKE_SUBDIR + +$(foreach DIR,$(SUBDIRS),$(MAKE) $(SUBDIR_FLAGS) -C $(DIR) $(MAKECMDGOALS) $(AND)) true + +$(foreach FILE,$(SUBMAKES),$(MAKE) $(SUBDIR_FLAGS) -C $(dir $(FILE)) -f $(notdir $(FILE)) $(MAKECMDGOALS) $(AND)) true +endef + +ifeq ($(MAKEFILE),Makefile) +MAKEFILE_ = +else +MAKEFILE_ = /$(MAKEFILE) +endif + +define ECHO_CURDIR + $(ECHO) "==== $(CURDIR)$(MAKEFILE_)"; +endef + +define DO_INSTALL_FILES + $(INSTALL) -d $(1) $(AND) \ + $(foreach FILE, $(2), \ + if [ ! -e $(1)/$(notdir $(FILE)) -o \ + $(FILE) -nt $(1)/$(notdir $(FILE)) ]; \ + then \ + $(ECHO) " install: $(FILE) -> $(1)" $(AND) \ + $(INSTALL) $(FILE) $(1)/$(notdir $(FILE)); \ + fi $(AND) ) true +endef + +DO_INSTALL = $(call DO_INSTALL_FILES,$(INSTALL_DIR),$(INSTALL_TARGETS)) + +INSTALL_INDEX_SRC = $(firstword $(INSTALL_TARGETS)) +INSTALL_INDEX_DEST = $(INSTALL_DIR)/$(notdir $(INSTALL_INDEX_SRC)) + +define DO_INSTALL_WILDCARD + $(INSTALL) -d $(INSTALL_DIR) $(AND) \ + if [ ! -e $(INSTALL_INDEX_DEST) -o \ + $(INSTALL_INDEX_SRC) -nt $(INSTALL_INDEX_DEST) ]; \ + then \ + $(foreach FILE, $(INSTALL_TARGETS), \ + $(ECHO) " install: $(FILE) -> $(INSTALL_DIR)" $(AND) \ + $(INSTALL) $(FILE) $(INSTALL_DIR) $(AND) ) true; \ + fi +endef + +#---------------------------------------------------------------------------- +# make parallelly +#---------------------------------------------------------------------------- + +SUBDIRS_PREFIX = make-subdir-p- +SUBDIRS_PARALLEL = $(addprefix $(SUBDIRS_PREFIX),$(SUBDIRS_P)) + +$(SUBDIRS_PARALLEL):$(SUBDIRS_PREFIX)%: + $(MAKE) -C $(*F) $(MAKECMDGOALS) + +#---------------------------------------------------------------------------- +# make build +#---------------------------------------------------------------------------- +.PHONY: do-build + +build: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) +ifneq ($(strip $(NEWDIRS)),) + @$(MKDIRP) $(NEWDIRS) +endif + @+$(REMAKE) do-build +ifdef INSTALL_TARGETS + @$(DO_INSTALL) +endif +ifeq ($(CTR_CODEGEN_ALL),True) +ifeq ($(CTR_CODEGEN),ARM) + @+$(REMAKE) CTR_CODEGEN_ALL=False CTR_CODEGEN=THUMB build +endif +endif + + +#---------------------------------------------------------------------------- +# make install +#---------------------------------------------------------------------------- + +install: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) +ifdef INSTALL_TARGETS + @$(DO_INSTALL) +endif +ifeq ($(CTR_CODEGEN_ALL),True) +ifeq ($(CTR_CODEGEN),ARM) + @+$(REMAKE) CTR_CODEGEN_ALL=False CTR_CODEGEN=THUMB install +endif +endif + + +#---------------------------------------------------------------------------- +# make full +#---------------------------------------------------------------------------- + +define makefull + @echo [[[ make full $(1) $(CURDIR) ]]] + @+unset CTR_DEBUG CTR_RELEASE CTR_FINALROM CTR_CODEGEN_ALL; \ + $(foreach b,FINALROM RELEASE DEBUG, \ + $(foreach a,ARM THUMB, \ + date "+::: %Y/%m/%d %H:%M:%S $a-$b" $(AND) \ + $(REMAKE) CTR_$b=TRUE CTR_CODEGEN=$a CTR_CODEGEN_ALL=False $(1) $(AND) \ + ) \ + ) true +endef + +full: + $(call makefull,build) + +full-install: + $(call makefull,install) + +#---------------------------------------------------------------------------- +# make super-full +#---------------------------------------------------------------------------- + +define makesuperfull + @echo [[[ make super-full $(1) $(CURDIR) ]]] + @+unset CTR_DEBUG CTR_RELEASE CTR_FINALROM CTR_CODEGEN_ALL; \ + $(foreach p,TS TEG, \ + $(foreach b,FINALROM RELEASE DEBUG, \ + $(foreach a,ARM THUMB, \ + date "+::: %Y/%m/%d %H:%M:%S $a-$b" $(AND) \ + $(REMAKE) CTR_$b=TRUE CTR_PLATFORM=$p CTR_CODEGEN=$a CTR_CODEGEN_ALL=False $(1) $(AND) \ + )\ + )\ + ) true +endef + +super-full: + $(call makesuperfull,build) + +super-full-install: + $(call makesuperfull,install) + +#---------------------------------------------------------------------------- +# Autotest using IS-NITRO-EMULATOR +#---------------------------------------------------------------------------- +ifdef IS_CTR_DIR + +AUTOTESTLOG := $(ROOT)/autotest.log + +.PHONY: autotest do-autotest do-autotest-test + +autotest: + @+$(REMAKE) clobber + @+$(REMAKE) build CTR_AUTOTEST=TRUE + @$(RM) $(AUTOTESTLOG) + @+$(REMAKE) do-autotest + @$(SED) -e 's/\r//g;s/$$/\r/g;' $(AUTOTESTLOG) > $(AUTOTESTLOG).tmp + @$(MV) $(AUTOTESTLOG).tmp $(AUTOTESTLOG) + +do-autotest: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) +ifneq ($(TARGET_ROM),) + @+$(REMAKE) test-run +endif +endif + + +#---------------------------------------------------------------------------- +# make clobber & clean +#---------------------------------------------------------------------------- +.PHONY: clobber-installed + +clobber: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) + -$(RM) $(GDIRT_CLEAN) $(LDIRT_CLEAN) $(EDIRT_CLEAN) + -$(RM) $(GDIRT_CLOBBER) $(LDIRT_CLOBBER) $(EDIRT_CLOBBER) +ifneq ($(GDIRT_INSTALLED),) +ifneq ($(CTR_FORCE_BUILD),) + $(call makefull,clobber-installed) +else + @+$(REMAKE) clobber-installed +endif +endif + +clobber-installed: + -$(RM) $(GDIRT_INSTALLED) + + +#---------------------------------------------------------------------------- + +super-clobber: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) + -$(RM) $(GDIRT_CLEAN) $(LDIRT_CLEAN) $(EDIRT_CLEAN) + -$(RM) $(GDIRT_CLOBBER) $(LDIRT_CLOBBER) $(EDIRT_CLOBBER) +ifneq ($(GDIRT_INSTALLED),) + $(call makesuperfull,clobber-installed) +endif + + +#---------------------------------------------------------------------------- + +clean: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) + -$(RM) $(GDIRT_CLEAN) $(LDIRT_CLEAN) $(EDIRT_CLEAN) + + +#---------------------------------------------------------------------------- +# source file dependancies +#---------------------------------------------------------------------------- + +# +# dynamic dependancy generation +# like as $(OBJDIR)/main.o: main.c +# +DEP_SRCS_ALL = $(SRCS) $(SRCS_AUTOLOAD) $(SRCS_OVERLAY) + +define RuleCtoObj +$$(OBJDIR)/$$(notdir $$(basename $(1))).o: $(1) + +endef +endif # CTRSDK_MODULERULES_ + +# Put this sentance out of include-guard to avoid $(eval xxx) limitation +$(foreach FILE,$(DEP_SRCS_ALL),$(eval $(call RuleCtoObj,$(FILE)))) + + +ifndef CTRSDK_MODULERULES_ +# +# include dependancies file +# +ifeq ($(MAKECMDGOALS),do-build) +ifdef SRCS +-include $(DEPENDDIR)/*.d +endif +endif + +#---------------------------------------------------------------------------- +# for IS-NITRO-EMULATOR +#---------------------------------------------------------------------------- +ifdef IS_CTR_DIR +-include $(CTR_BUILDTOOLSDIR)/modulerules.emtype.ISD +endif + +#---------------------------------------------------------------------------- +# Load add-ins' modulerules +#---------------------------------------------------------------------------- +-include $(CTR_BUILDTOOLSDIR)/modulerules.add-ins.* + +#---------------------------------------------------------------------------- +CTRSDK_MODULERULES_ = TRUE +endif # CTRSDK_MODULERULES_ +#----- End of modulerules ----- diff --git a/trunk/build/buildtools/modulerules.add-ins.twl b/trunk/build/buildtools/modulerules.add-ins.twl new file mode 100644 index 0000000..7780dc9 --- /dev/null +++ b/trunk/build/buildtools/modulerules.add-ins.twl @@ -0,0 +1,57 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrSDK - modulerules - common rules for build system +# File: modulerules +# +# Copyright 2007 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- +ifndef TWLSDK_MODULERULES_ + +#---------------------------------------------------------------------------- +.PHONY: twltop twllib twldbg link + +link: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) + -rm $(BINDIR)/$(TARGET_BIN_BASENAME).axf $(BINDIR)/$(TARGET_BIN_BASENAME).nef + @+$(REMAKE) + +twltop: + @$(MAKE) -C $(TWLSDK_ROOT) + +twllib: + @$(MAKE) -C $(TWLSDK_ROOT)/build/buildsetup + @$(MAKE) -C $(TWLSDK_ROOT)/build/libraries + +twldbg: + @$(TOUCH) $(TWL_LDEPENDS_DBG) + @$(MAKE) -C $(TWLSDK_ROOT)/build/libraries/os + @+$(REMAKE) + +# .axf +$(BINDIR)/$(TARGET_BIN_BASENAME).axf: $(OBJS) $(LCFILE) $(MAKEFILE) $(LDEPENDS_NEF) $(EDEPENDS_NEF) $(ALIBRARIES) $(LDRES_FILE) $(CW_LIBCXX) +ifeq ($(CTR_CCTYPE),RVCT) + $(LD) $(LDFLAGS) $(LIBRARY_DIRS) -o $@ $(GLIBRARIES) $(OBJS) +else + $(LD) $(LDFLAGS) $(LIBRARY_DIRS) @$(LDRES_FILE) $(LCFILE) -o $@ +ifeq ($(TWL_PLATFORM),TS) + cp $(BINDIR)/$(TARGET_BIN_BASENAME).axf $(BINDIR)/$(TARGET_BIN_BASENAME).nef +endif +ifdef FIRM_STRIP_AXF + $(OBJCOPY) $@ $(BINDIR)/$(TARGET_BIN_BASENAME).sbin +endif +endif + +#---------------------------------------------------------------------------- +TWLSDK_MODULERULES_ = TRUE +endif # TWLSDK_MODULERULES_ +#----- End of modulerules ----- diff --git a/trunk/build/buildtools/modulerules.add-ins.twldll b/trunk/build/buildtools/modulerules.add-ins.twldll new file mode 100644 index 0000000..d3c1090 --- /dev/null +++ b/trunk/build/buildtools/modulerules.add-ins.twldll @@ -0,0 +1,53 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrSDK - modulerules - common rules for build system +# File: modulerules +# +# Copyright 2007 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- +ifndef TWLDLL_MODULERULES_ + +#---------------------------------------------------------------------------- + +#MakefileでDLL_FILESを定義しておくとmake dllでstaticsymlist.cができます + +DLL_LIBS ?= $(addprefix $(TWL_LIBDIR)/,$(addsuffix $(TWL_LIBSUFFIX).a,$(DLL_FILES))) +NODBG_LIBS ?= $(addprefix $(TWL_LIBDIR)/,$(addsuffix $(TWL_LIBSUFFIX).nodbg.a,$(DLL_FILES))) +STATIC_LIBS ?= $(addprefix $(TWL_LIBDIR)/,$(TWL_LIBS)) + +.PHONY: dll + +dll: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) +ifdef DLL_FILES + $(foreach DLLFILE, $(DLL_LIBS), \ + $(TWLSDK_ROOT)/tools/stripdebug/stripdebug.exe -o $(subst .a,.nodbg.a,$(DLLFILE)) $(DLLFILE);) + + $(TWLSDK_ROOT)/tools/makelst/makelst.exe -o $(SRCDIR)/staticsymlist.c \ + -static $(STATIC_LIBS) \ + -dll $(NODBG_LIBS) +endif + + +# +# $(foreach DLLFILE, $(DLL_LIBS), \ +# $(TWLSDK_ROOT)/tools/makelst/makelst.exe -o staticsymlist.c \ +# -static $(STATIC_LIBS) \ +# -dll $(TWL_LIBDIR)/$(DLLFILE) +#) +# + +#---------------------------------------------------------------------------- +TWLDLL_MODULERULES_ = TRUE +endif # TWLDLL_MODULERULES_ +#----- End of modulerules ----- diff --git a/trunk/build/buildtools/modulerules.add-ins.utest b/trunk/build/buildtools/modulerules.add-ins.utest new file mode 100644 index 0000000..575f472 --- /dev/null +++ b/trunk/build/buildtools/modulerules.add-ins.utest @@ -0,0 +1,67 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrSDK - UnitTest Tool +# File: modulerules.add-ins.utest +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded insructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +.PHONY: utest + +# +# UNIT TEST on ARM11 +# +ifeq ($(CODEGEN_PROC),ARM11) + +UTEST_MAKEOPTS = \ + SRCS="$(SRCS) $(UTEST_MAIN_SRC)" \ + LIBRARIES_UNLINK=$(TARGET_LIB) \ + TARGET_BIN=$(UTEST_MAIN_BIN) \ + TARGET_NEF= \ + TARGET_LIB= \ + TARGET_OBJ= \ + TARGET_SIGN_BIN= \ + UTEST_OBJS_TESTEE="$(OBJS)" \ + UTEST_CHECKASSERT=True \ + CTR_UTEST=True + +utest: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) +ifneq ($(strip $(TARGET_LIB)),) +ifneq ($(strip $(NEWDIRS)),) + @$(MKDIRP) $(NEWDIRS) $(BINDIR) +endif + @$(REMAKE) -s $(UTEST_MAIN_SRC) $(UTEST_MAKEOPTS) + @if [ -e $(UTEST_MAIN_SRC) ]; \ + then \ + $(REMAKE) -s do-build $(UTEST_MAKEOPTS) && \ + $(REMAKE) -s run TARGET_BIN=$(UTEST_MAIN_BIN); \ + fi +endif + +$(UTEST_MAIN_SRC): $(UTEST_OBJS_TESTEE) + @$(MAKE_UTEST_MAIN) -c $(UTEST_MAIN_SRC) $(UTEST_OBJS_TESTEE) + + +# +# UNIT TEST on ARM9 +# +else # ($(CODEGEN_PROC),ARM9) + +utest: + @ # Not support unit test on ARM9 + +endif + + +#===== End of modulerules.add-ins.utest ===== diff --git a/trunk/build/buildtools/modulerules.cctype.CW b/trunk/build/buildtools/modulerules.cctype.CW new file mode 100644 index 0000000..820fb40 --- /dev/null +++ b/trunk/build/buildtools/modulerules.cctype.CW @@ -0,0 +1,338 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrSDK - buildtools - compiler dependant settings for CodeWarrior +# File: modulerules.cctype.CW +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +AINCLUDE_DIRS = $(LINCLUDES) $(EINCLUDES) $(GINCLUDES) +ALIBRARY_DIRS = $(LLIBRARY_DIRS) $(ELIBRARY_DIRS) $(GLIBRARY_DIRS) +ALIBRARIES = $(LLIBRARIES) $(ELIBRARIES) $(GLIBRARIES) + +# +# (make version 3.80) +# +# VPATH does not support the path name included white space like "C:/Program Files" +# Please, be careful !!! +# +ifdef MSYSTEM +CTR_LIBVPATH_ = $(subst \:,\ ,$(subst $(SPACE),:,$(ALIBRARY_DIRS))) +else +CYGDRV ?= $(shell cygpath -u c:)/.. +ALIBVPATH = $(subst : ,,$(patsubst %:,$(CYGDRV)/%:,$(subst :,: ,$(ALIBRARY_DIRS)))) +endif + +vpath %.a $(ALIBVPATH) +vpath %.o $(ALIBVPATH) + +INCLUDE_DIRS = $(subst \ -I,\ ,$(addprefix -I,$(AINCLUDE_DIRS))) +LIBRARY_DIRS = $(subst \ -L,\ ,$(addprefix -L,$(ALIBRARY_DIRS))) +LIBRARIES = $(subst \ -l,\ ,$(addprefix -l,$(ALIBRARIES))) + +INCLUDES = -gccinc -I. $(INCLUDE_DIRS) + +ifdef MSYSTEM # for MinGW32 +QUOTE =' +else +QUOTE =" +endif + +#---------------------------------------------------------------------------- + +.PRECIOUS: $(OBJDIR)/%.o $(BINDIR)/%.nef $(LCFILE) $(PCHDR_H) $(PCHDR_PCH) + +# +# Generate dependency files +# +DEPEND_RULE = $(QUOTE)/ARM_EABI_Support/d;s/\\x0D//g;s/\\\\\\([^ ]\\)/\\/\\1/g;$(QUOTE) +DEPEND_RULE2 = $(QUOTE)s/^[^\\t].*: //;s/^\\t//;s/ \\\\$$//;s/\\([^ ].*\\)/\\1:/;1s/^./\\n&/;$(QUOTE) + +define MOVE_SRC_DEPEND + $(SED) -e $(DEPEND_RULE) $(*F).d > $(*F).2.d && \ + $(SED) -e $(DEPEND_RULE2) $(*F).2.d > $(*F).3.d && \ + $(CAT) $(*F).2.d $(*F).3.d > $(DEPENDDIR)/$(*F).d && \ + $(RM) $(*F).d $(*F).2.d $(*F).3.d +endef + + +ifdef CTR_STD_PCHDR +ifndef CTR_NO_STD_PCHDR + +# .mch +PCHDR_SRC = $(ROOT)/include/nitro.h +PCHDR_CACHE = $(ROOT)/cache/include + +PCHDR_C_DEFS = $(sort $(filter -DSDK_%,$(CCFLAGS))) +PCHDR_C_NODEF = $(filter-out -D%,$(CCFLAGS)) +PCHDR_C_NAME = $(subst $(SPACE),,$(subst -DSDK_,.,$(subst =,-,$(PCHDR_C_DEFS)))) +PCHDR_C_BASE = $(PCHDR_CACHE)/$(notdir $(PCHDR_SRC))$(PCHDR_C_NAME).C +PCHDR_C_MCH = $(PCHDR_C_BASE).mch +PCHDR_C_DEPEND = $(PCHDR_C_BASE).depend +PCHDR_CCFLAGS = -include $(PCHDR_C_MCH) +CCFLAGS_NOLDEF = $(PCHDR_C_DEFS) $(PCHDR_C_NODEF) + +PCHDR_CXX_DEFS = $(sort $(filter -DSDK_%,$(CXXFLAGS))) +PCHDR_CXX_NODEF = $(filter-out -D%,$(CXXFLAGS)) +PCHDR_CXX_NAME = $(subst $(SPACE),,$(subst -DSDK_,.,$(subst =,-,$(PCHDR_CXX_DEFS)))) +PCHDR_CXX_BASE = $(PCHDR_CACHE)/$(notdir $(PCHDR_SRC))$(PCHDR_CXX_NAME).CXX +PCHDR_CXX_MCH = $(PCHDR_CXX_BASE).mch +PCHDR_CXX_DEPEND= $(PCHDR_CXX_BASE).depend +PCHDR_CXXFLAGS = -include $(PCHDR_CXX_MCH) +CXXFLAGS_NOLDEF = $(PCHDR_CXX_DEFS) $(PCHDR_CXX_NODEF) + +GDIRT_CLOBBER += $(PCHDR_CACHE)/$(notdir $(PCHDR_SRC)).* + +ifeq ($(MAKECMDGOALS),do-build) + +## $(call BUILD_PCHDR,$(BASE),$(CCFLAGS)) +define BUILD_PCHDR + @$(CP) $(PCHDR_SRC) $(1).h + ($(CD) $(dir $(1).mch) && \ + $(CC) $(subst -include ,-DSDK_PCHDR_DUMMY_,$(2)) $(INCLUDES) -MD -precompile $(notdir $(1).mch) $(1).h) + @($(ECHO) $(1).mch: $(PCHDR_SRC) \\ > $(1).depend && \ + $(SED) -e '1d' -e $(DEPEND_RULE) $(1).d >> $(1).depend && $(RM) $(1).d $(1).h) +endef + +# precomipled header for C +ifneq ($(strip $(OBJS_CC)),) +-include $(PCHDR_C_DEPEND) + +$(PCHDR_C_DEPEND): $(PCHDR_C_MCH) + +$(PCHDR_C_MCH): + $(call BUILD_PCHDR,$(PCHDR_C_BASE),$(CCFLAGS_NOLDEF)) +endif + +# precomipled header for C++ +ifneq ($(strip $(OBJS_CXX)),) +-include $(PCHDR_CXX_DEPEND) + +$(PCHDR_CXX_DEPEND): $(PCHDR_CXX_MCH) + +$(PCHDR_CXX_MCH): + $(call BUILD_PCHDR,$(PCHDR_CXX_BASE),$(CXXFLAGS_NOLDEF)) +endif + +endif # do-build +endif # CTR_NO_STD_PCHDR +endif # CTR_STD_PCHDR + +# .c +$(OBJS_CC):%.o: + $(CC) $(CCFLAGS) $(INCLUDES) $(PCHDR_CCFLAGS) -c $(shell cygpath -m $<) -MD -o $@ + @$(MOVE_SRC_DEPEND) + +# .cpp +$(OBJS_CXX):%.o: + $(CC) $(CXXFLAGS) $(INCLUDES) $(PCHDR_CXXFLAGS) -c $(shell cygpath -m $<) -MD -o $@ + @$(MOVE_SRC_DEPEND) + +# .s +$(OBJS_AS):%.o: + $(AS) $(ASFLAGS) $(INCLUDES) -c $(shell cygpath -m $<) -MD -o $@ + @$(MOVE_SRC_DEPEND) + +# .lcf .par +ifdef LCFILE_SPEC + +ADDRESS_DTCM ?= $(DEFAULT_ADDRESS_DTCM) + +# exporting +GLIBRARIES_LINK = $(filter-out $(LIBRARIES_UNLINK),$(ELIBRARIES) $(GLIBRARIES)) +LLIBRARIES_LINK = $(filter-out $(LIBRARIES_UNLINK),$(LLIBRARIES)) + +MAKELCF_DEFS = -DCTRSDK_ROOT='$(ROOT)' \ + -DTARGET_NAME='$(TARGET_NAME)' \ + -DOBJS_STATIC='$(OBJS_STATIC)' \ + -DOBJS_AUTOLOAD='$(OBJS_AUTOLOAD)' \ + -DOBJS_OVERLAY='$(OBJS_OVERLAY)' \ + -DGLIBS='$(GLIBRARIES_LINK)' \ + -DLLIBS='$(LLIBRARIES_LINK)' \ + -DCW_LIBS='$(CW_LIBS)' \ + -DOBJDIR='$(OBJDIR)' \ + -DLIBDIR='$(LIBDIR)' \ + -DBINDIR='$(BINDIR)' \ + -DPROC='$(CODEGEN_PROC)' \ + -DPLATFORM='$(CTR_PLATFORM)' \ + -DCODEGEN='$(CODEGEN_ARCH)' \ + -DBUILD='$(CTR_BUILD_DIR)' \ + -DADDRESS_DTCM='$(ADDRESS_DTCM)' + +MAKELCF_FORMAT = -V$(CW_MAJOR_VER) + +MAKELCF_OPTS = $(MAKELCF_FLAGS) $(MAKELCF_DEFS) $(MAKELCF_FORMAT) + +$(LCFILE_AUTOGEN): $(LCFILE_SPEC) $(LCFILE_TEMPLATE) $(MAKEFILE) $(CTR_BUILDTOOLSDIR)/commondefs $(LDEPENDS_LCF) + $(MAKELCF) $(MAKELCF_OPTS) $< $(LCFILE_TEMPLATE) $@ + +$(LDRES_AUTOGEN): $(LCFILE_SPEC) $(LDRES_TEMPLATE) $(MAKEFILE) $(CTR_BUILDTOOLSDIR)/commondefs $(LDEPENDS_RES) + @$(MAKELCF) $(MAKELCF_OPTS) $< $(LDRES_TEMPLATE) $@ + +endif + +# compress/digest +ifeq ($(CODEGEN_PROC),ARM11) +ifdef CTR_COMPRESS +COMPSTATIC_CMDS = -11 -c +#COMPSTATIC_CMDS = -9 -c +endif +ifdef CTR_DIGEST +COMPSTATIC_CMDS += -a +endif +endif + +ifdef COMPSTATIC_CMDS +COMPSUFFIX ?= $(DEFAULT_COMPSUFFIX) +ifneq ($(COMPSUFFIX),) +COMPSTATIC_FLAGS += -e$(COMPSUFFIX) +endif +endif + + +# libcxx workaround +ifdef SDK_CW_WA_LIBCXX +CW_LIBCXX = $(CW_LIBCXX_DIR)/$(CW_LIBCXX_ARM) +$(CW_LIBCXX): $(ROOT)/build/buildsetup/libcxx/Makefile + $(MAKE) -f $< +endif + + +# .nef +ifndef USE_MY_RULE_NEF +ifneq ($(CTR_MAKEROM),) +$(BINDIR)/$(TARGET_BIN_BASENAME).nef: $(OBJS) $(LCFILE) $(MAKEFILE) $(LDEPENDS_NEF) $(EDEPENDS_NEF) $(ALIBRARIES) $(LDRES_FILE) $(CW_LIBCXX) + $(LD) $(LDFLAGS) $(LIBRARY_DIRS) @$(LDRES_FILE) $(LCFILE) -o $@ +ifdef COMPSTATIC_CMDS + $(COMPSTATIC) $(COMPSTATIC_CMDS) $(COMPSTATIC_FLAGS) -f $(BINDIR)/component.files $(CTR_STDOUT) +endif +else +$(BINDIR)/$(TARGET_BIN_BASENAME).nef: $(OBJS) $(LCFILE) $(MAKEFILE) $(LDEPENDS_NEF) $(EDEPENDS_NEF) $(ALIBRARIES) $(CW_LIBCXX) + $(LD) $(LDFLAGS) $(LIBRARY_DIRS) $(OBJS) $(LIBRARIES) $(LCFILE) -o $@ +endif +endif + +# .a +ifndef USE_MY_RULE_A +$(LIBDIR)/$(TARGET_LIB): $(OBJS) $(MAKEFILE) + $(AR) $(ARFLAGS) $(OBJS) -o $@ +endif + + +#---------------------------------------------------------------------------- +# Get SDK_CW_BUILD_VERSION SDK_CW_BUILD_NUMBER +# +# IRIS V0.2 Hotfix 1 +# SDK_CW_BUILD_VERSION_CC=2.0 +# SDK_CW_BUILD_VERSION_LD=2.0 +# SDK_CW_BUILD_NUMBER_CC=0038 +# SDK_CW_BUILD_NUMBER_LD=0050 +# +# NITRO V0.3 +# SDK_CW_BUILD_NUMBER_CC=0038 +# SDK_CW_BUILD_NUMBER_LD=0056 +# +# NITRO V0.4.1 +# SDK_CW_BUILD_NUMBER_CC=0043 +# SDK_CW_BUILD_NUMBER_LD=0057 +# +# NITRO V0.5 +# SDK_CW_BUILD_NUMBER_CC=0046 +# SDK_CW_BUILD_NUMBER_LD=0058 +# +# NITRO V0.5 + HotFix1 +# SDK_CW_BUILD_NUMBER_CC=0049 +# SDK_CW_BUILD_NUMBER_LD=0061 +# +# NITRO V0.6 +# SDK_CW_BUILD_NUMBER_CC=0050 +# SDK_CW_BUILD_NUMBER_LD=0062 +# +# NITRO V0.6.1 +# SDK_CW_BUILD_NUMBER_CC=0050 +# SDK_CW_BUILD_NUMBER_LD=0063 +# +# NITRO V0.7 +# SDK_CW_BUILD_NUMBER_CC=0050 +# SDK_CW_BUILD_NUMBER_LD=0063 +# +# NITRO V1.0 +# SDK_CW_BUILD_NUMBER_CC=0056 +# SDK_CW_BUILD_NUMBER_LD=0067 +# +# NITRO V1.0.2 +# SDK_CW_BUILD_NUMBER_CC=0068 +# SDK_CW_BUILD_NUMBER_LD=0068 +# +# NITRO V1.2 +# SDK_CW_BUILD_NUMBER_CC=0073 +# SDK_CW_BUILD_NUMBER_LD=0072 +# +# NITRO V1.2SP1 +# SDK_CW_BUILD_NUMBER_CC=0074 +# SDK_CW_BUILD_NUMBER_LD=0072 +# +# NITRO V1.2SP2+patch +# SDK_CW_BUILD_NUMBER_CC=0080 +# SDK_CW_BUILD_NUMBER_LD=0074 +# +# NITRO V1.2SP3 +# SDK_CW_BUILD_NUMBER_CC=0084 +# SDK_CW_BUILD_NUMBER_LD=0077 +# +# NITRO V1.2SP4 +# SDK_CW_BUILD_NUMBER_CC=0087 +# SDK_CW_BUILD_NUMBER_LD=7702 +# +# NITRO V2.0beta +# SDK_CW_BUILD_VERSION_CC=3.0 +# SDK_CW_BUILD_VERSION_LD=2.0 +# SDK_CW_BUILD_NUMBER_CC=0107 +# SDK_CW_BUILD_NUMBER_LD=0077 +# +# NITRO V2.0 +# SDK_CW_BUILD_NUMBER_CC=0114 +# SDK_CW_BUILD_NUMBER_LD=0082 +# +ifneq ($(findstring $(MAKECMDGOALS),do-build make-verinfo clean-verinfo),) + +.PHONY: make-verinfo +make-verinfo: $(SDK_VERINFO_CW_CC) $(SDK_VERINFO_CW_LD) + +$(SDK_VERINFO_CW_CC): $(MWCC) + @$(MWCC) -version | \ + $(SED) -e $(QUOTE)/^Version /!d;s/\(build [0-9]\{2,3\}\) /\100 /;s/^Version \([0-9.]*\).*build \([0-9]*\).*(build \([0-9]*\)).*/SDK_CW_BUILD_VERSION_CC=\1\nSDK_CW_BUILD_NUMBER_CC=\3\nSDK_CW_BUILD_NUMBER2_CC=\2/i;$(QUOTE) >$(SDK_VERINFO_CW_CC) + @$(TOUCH) -r $(MWCC) $(SDK_VERINFO_CW_CC) + +$(SDK_VERINFO_CW_LD): $(MWLD) + @$(MWLD) -version | \ + $(SED) -e $(QUOTE)/^Version /!d;s/\(build [0-9]\{2,3\}\) /\100 /;s/^Version \([0-9.]*\).*build \([0-9]*\).*(build \([0-9]*\)).*/SDK_CW_BUILD_VERSION_LD=\1\nSDK_CW_BUILD_NUMBER_LD=\3\nSDK_CW_BUILD_NUMBER2_LD=\2/i;$(QUOTE) >$(SDK_VERINFO_CW_LD) + @$(TOUCH) -r $(MWLD) $(SDK_VERINFO_CW_LD) + +endif + +.PHONY: clean-verinfo +clean-verinfo: + @$(RM) $(CTR_BUILDTOOLSDIR)/verinfo.* + + +#---------------------------------------------------------------------------- +# Check codegen bug around blxeq/blxne +# + +.PHONY: codecheck + +codecheck: + @$(ECHO) --- checking codegen --- + @$(CTR_TOOLSDIR)/bin/blxchecker + +#----- End of modulerules.cctype.CW ----- diff --git a/trunk/build/buildtools/modulerules.cctype.RVCT b/trunk/build/buildtools/modulerules.cctype.RVCT new file mode 100644 index 0000000..aa0153b --- /dev/null +++ b/trunk/build/buildtools/modulerules.cctype.RVCT @@ -0,0 +1,150 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrFirm - buildtools - compiler dependant settings for ProDG +# File: modulerules.cctype.RVCT +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +AINCLUDE_DIRS = $(LINCLUDES) $(EINCLUDES) $(GINCLUDES) $(RVCT_INCDIRS) +ALIBRARY_DIRS = $(LLIBRARY_DIRS) $(ELIBRARY_DIRS) $(GLIBRARY_DIRS) # $(RVCT_LIBDIRS) +ALIBRARIES = $(LLIBRARIES) $(ELIBRARIES) $(GLIBRARIES) + +# +# (make version 3.80) +# +# VPATH does not support the path name included white space like "C:/Program Files" +# Please, be careful !!! +# +ifdef MSYSTEM +CTR_LIBVPATH_ = $(subst \:,\ ,$(subst $(SPACE),:,$(ALIBRARY_DIRS))) +else +CYGDRV ?= $(shell cygpath -u c:)/.. +ALIBVPATH = $(subst : ,,$(patsubst %:,$(CYGDRV)/%:,$(subst :,: ,$(ALIBRARY_DIRS)))) +endif + +vpath %.a $(ALIBVPATH) +vpath %.o $(ALIBVPATH) + +INCLUDE_DIRS = $(subst \ -I,\ ,$(addprefix -I,$(AINCLUDE_DIRS))) +LIBRARY_DIRS = $(subst \ -L,\ ,$(addprefix --userlibpath ,$(ALIBRARY_DIRS))) +LIBRARIES = $(subst \ -l,\ ,$(addprefix -l,$(ALIBRARIES))) + +INCLUDES = -I. $(INCLUDE_DIRS) + +ifdef MSYSTEM # for MinGW32 +QUOTE =' +else +QUOTE =" +endif + +#---------------------------------------------------------------------------- + +.PRECIOUS: $(OBJDIR)/%.o $(BINDIR)/%.nef $(LCFILE) + +# +# Generate dependency files +# +DEPEND_RULE = $(QUOTE)s/^\(.*\)\s\(.*\)$$/&\n\2:/;$(QUOTE) + +define MOVE_SRC_DEPEND + $(SED) -e $(DEPEND_RULE) $(*F).d > $(DEPENDDIR)/$(*F).d && $(RM) $(*F).d +endef + +# .c +$(OBJS_CC):%.o: + $(CC) $(CCFLAGS) $(INCLUDES) -c $(shell cygpath -m $<) --depend_format=unix_escaped --depend $(*F).d -o $@ + @$(MOVE_SRC_DEPEND) + +# .cpp +$(OBJS_CXX):%.o: + $(CC) $(CXXFLAGS) $(INCLUDES) -c $(shell cygpath -m $<) --depend_format=unix_escaped --depend $(*F).d -o $@ + @$(MOVE_SRC_DEPEND) + +# .s +$(OBJS_AS):%.o: + $(AS) $(ASFLAGS) --depend $(*F).d -o $@ $(shell cygpath -m $<) + @$(MOVE_SRC_DEPEND) + +# .lcf .par +ifdef LCFILE_SPEC + +ADDRESS_DTCM ?= $(DEFAULT_ADDRESS_DTCM) + +# exporting +MAKELCF_DEFS = -DCTRSDK_ROOT='$(ROOT)' \ + -DTARGET_NAME='$(TARGET_NAME)' \ + -DOBJS_STATIC='$(OBJS_STATIC)' \ + -DOBJS_AUTOLOAD='$(OBJS_AUTOLOAD)' \ + -DOBJS_OVERLAY='$(OBJS_OVERLAY)' \ + -DGLIBS='$(GLIBRARIES)' \ + -DLLIBS='$(LLIBRARIES)' \ + -DCW_LIBS='$(SN_LIBS)' \ + -DOBJDIR='$(OBJDIR)' \ + -DLIBDIR='$(LIBDIR)' \ + -DBINDIR='$(BINDIR)' \ + -DPROC='$(CODEGEN_PROC)' \ + -DPLATFORM='$(CTR_PLATFORM)' \ + -DCODEGEN='$(CODEGEN_ARCH)' \ + -DBUILD='$(CTR_BUILD_DIR)' \ + -DADDRESS_DTCM='$(ADDRESS_DTCM)' + +MAKELCF_OPTS = $(MAKELCF_FLAGS) $(MAKELCF_DEFS) + + +$(LCFILE_AUTOGEN): $(LCFILE_TEMPLATE) $(MAKEFILE) $(LDEPENDS_LCF) + $(CC) $(CCFLAGS) $(INCLUDES) -E -o $(LCFILE_AUTOGEN) $(LCFILE_TEMPLATE) + +$(LDRES_AUTOGEN): $(LCFILE_SPEC) $(LDRES_TEMPLATE) $(MAKEFILE) $(LDEPENDS_RES) + $(MAKELCF) $(MAKELCF_OPTS) $< $(LDRES_TEMPLATE) $@ + +endif + + +# compress/digest +ifeq ($(CODEGEN_PROC),ARM11) +ifdef CTR_COMPRESS +COMPSTATIC_CMDS = -11 -c +#COMPSTATIC_CMDS = -9 -c +endif +ifdef CTR_DIGEST +COMPSTATIC_CMDS += -a +endif +endif + +ifdef COMPSTATIC_CMDS +COMPSUFFIX ?= $(DEFAULT_COMPSUFFIX) +ifneq ($(COMPSUFFIX),) +COMPSTATIC_FLAGS += -e$(COMPSUFFIX) +endif +endif + + +# .nef +ifndef USE_MY_RULE_NEF +$(BINDIR)/$(TARGET_BIN_BASENAME).nef: $(OBJS) $(MAKEFILE) $(LDEPENDS_NEF) $(LDRES_FILE) $(ALIBRARIES) +# $(LD) $(LDFLAGS) -T $(LCFILE) -LSF $(LCFILE_SPEC) -Map $@.xMAP $(LIBRARY_DIRS) @$(LDRES_FILE) -o $@ + $(LD) $(LDFLAGS) -T $(LCFILE) -Map $@.xMAP $(LIBRARY_DIRS) @$(LDRES_FILE) -o $@ +ifdef COMPSTATIC_CMDS + $(COMPSTATIC) $(COMPSTATIC_CMDS) $(COMPSTATIC_FLAGS) -f $(BINDIR)/component.files $(CTR_STDOUT) +endif +endif + + +# .a +ifndef USE_MY_RULE_A +$(LIBDIR)/$(TARGET_LIB): $(OBJS) $(MAKEFILE) + $(AR) $(ARFLAGS) $@ $(OBJS) +endif + + +#----- End of modulerules.cctype.RVCT ----- diff --git a/trunk/build/buildtools/modulerules.emtype.ISD b/trunk/build/buildtools/modulerules.emtype.ISD new file mode 100644 index 0000000..df253cc --- /dev/null +++ b/trunk/build/buildtools/modulerules.emtype.ISD @@ -0,0 +1,41 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrSDK - buildtools - debugger dependant settings for ISDbgr +# File: modulerules.emtype.ISD +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +#---------------------------------------------------------------------------- +# Run command for IS-NITRO-EMULATOR +#---------------------------------------------------------------------------- +ifneq ($(TARGET_ROM),) + +.PHONY: run test-run +run: + @if [ -e "$(ISD_NITLOAD_GCC)" ]; \ + then \ + $(ISD_NITLOAD_GCC) -p $(BINDIR)/$(firstword $(TARGET_BIN)); \ + else \ + $(ISD_NITLOAD) -p $(BINDIR)/$(firstword $(TARGET_BIN)); \ + fi + +#test-run: +# @echo ==== $(CURDIR) > $(AUTOTESTLOG).tmp +# @echo :TEST-TARGET: [$(BINDIR)/$(firstword $(TARGET_BIN))] >> $(AUTOTESTLOG).tmp +# @echo >> $(AUTOTESTLOG).tmp +# cscript $(NITRO_TOOLSDIR)/bin/runEmu.js //Nologo //T:60 $(BINDIR)/$(firstword $(TARGET_BIN)) $(AUTOTESTLOG).tmp +# @gawk '/ / || NR <= 30' $(AUTOTESTLOG).tmp >> $(AUTOTESTLOG) +# @echo >> $(AUTOTESTLOG) +endif + +#----- End of modulerules.emtype.ISD ----- diff --git a/trunk/build/buildtools/modulerules.x86 b/trunk/build/buildtools/modulerules.x86 new file mode 100644 index 0000000..e5c4a88 --- /dev/null +++ b/trunk/build/buildtools/modulerules.x86 @@ -0,0 +1,158 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrSDK - modulerules - common rules for build system +# File: modulerules.x86 +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +#---------------------------------------------------------------------------- +# Implicit RULES +#---------------------------------------------------------------------------- +WARNING = -Wall + +LEX = flex +YACC = bison -y + +# workaround for flex gen code to avoid warnings +%.yy.o:WARNING += -Wno-unused-label -Wno-unused-function + +ifdef DEBUG +MACROS += -DDEBUG -g +endif + +ifdef CTR_DEBUG +MACROS += -g +endif + +define COMPILE_C + $(CC_X86) $(MACROS) -DSDK_WIN32 $(WARNING) -c -I. -I$(CTR_INCDIR) $< -o $@ +endef + +define COMPILE_CXX + $(CXX_X86) $(MACROS) -DSDK_WIN32 $(WARNING) -c -I. -I$(CTR_INCDIR) $< -o $@ +endef + +%.o: %.c + $(COMPILE_C) + +%.o: %.cpp + $(COMPILE_CXX) + +%.yy.c: %.l + $(LEX) -P$(basename $<)_yy -o$@ $< + +%.tab.c: %.y + $(YACC) -d -p $(basename $<)_yy -b $(basename $<) $< + +%.tab.h: %.tab.c + +#---------------------------------------------------------------------------- +# MAKE TARGETS +#---------------------------------------------------------------------------- + +.PHONY: all default build do-build install do-install \ + clean clobber super-clobber + + +#---------------------------------------------------------------------------- + +define MAKE_SUBDIR + +$(foreach DIR,$(SUBDIRS),$(MAKE) -C $(DIR) $(MAKECMDGOALS) $(AND)) true + +$(foreach FILE,$(SUBMAKES),$(MAKE) -C $(dir $(FILE)) -f $(notdir $(FILE)) $(MAKECMDGOALS) $(AND)) true +endef + +ifeq ($(MAKEFILE),Makefile) +MAKEFILE_ = +else +MAKEFILE_ = /$(MAKEFILE) +endif + +define ECHO_CURDIR + $(ECHO) "==== $(CURDIR)$(MAKEFILE_)"; +endef + +#---------------------------------------------------------------------------- +# make build +#---------------------------------------------------------------------------- + +build: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) +ifdef TARGETS +ifdef NEWDIRS + @$(MKDIRP) $(NEWDIRS) +endif + @+$(REMAKE) do-build +ifdef INSTALL_TARGETS + @+$(REMAKE) do-install +endif +endif + + +#---------------------------------------------------------------------------- +# make install +#---------------------------------------------------------------------------- + +install: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) +ifdef INSTALL_TARGETS + @+$(REMAKE) do-install +endif + + +define DO_INSTALL + $(INSTALL) -d $(INSTALL_DIR) $(AND) \ + $(foreach FILE, $(INSTALL_TARGETS), \ + if [ ! -e $(INSTALL_DIR)/$(notdir $(FILE)) -o \ + $(FILE) -nt $(INSTALL_DIR)/$(notdir $(FILE)) ]; \ + then \ + $(ECHO) " install: $(FILE) -> $(INSTALL_DIR)" $(AND) \ + $(INSTALL) $(FILE) $(INSTALL_DIR)/$(notdir $(FILE)); \ + fi $(AND) ) true +endef + + +do-install: + @$(DO_INSTALL) + +#---------------------------------------------------------------------------- +# make do-autotest +#---------------------------------------------------------------------------- + +do-autotest: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) + + +#---------------------------------------------------------------------------- +# make clobber & clean +#---------------------------------------------------------------------------- + +super-clobber clobber: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) + -$(RM) $(GDIRT_CLEAN) $(LDIRT_CLEAN) + -$(RM) $(GDIRT_CLOBBER) $(LDIRT_CLOBBER) + -$(RM) $(GDIRT_INSTALLED) + + +#---------------------------------------------------------------------------- + +clean: + @$(MAKE_SUBDIR) + @$(ECHO_CURDIR) + -$(RM) $(GDIRT_CLEAN) $(LDIRT_CLEAN) + + +#----- End of modulerules ----- diff --git a/trunk/build/buildtools/sdk_indent.pl b/trunk/build/buildtools/sdk_indent.pl new file mode 100644 index 0000000..1e9148d --- /dev/null +++ b/trunk/build/buildtools/sdk_indent.pl @@ -0,0 +1,80 @@ +#!/usr/bin/perl + +############################################################################## +# +# Project: CtrSDK - code formatter- +# File: sdk_indent.pl +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: sdk_indent.pl,v $ +# Revision 1.2 2004/02/05 07:09:01 yasu +# change SDK prefix iris -> nitro +# +# Revision 1.1 2003/12/01 11:17:08 nishida_kenji +# 新規 +# +# $NoKeywords: $ +############################################################################## + +foreach $filename (@ARGV) { + print STDERR "processing $filename\n"; + open INFILE, "$filename" or die "cannot open infile $filename\n"; + $intext = ""; + while() { + $intext .= $_; + } + + close(INFILE); + + next if ($intext =~ m/\Wasm\W/s); #asmがあったら何もしない! + { + # intext処理部 + $intext =~ s/extern\s+\"C\"[^{]*\{/extern \"C\";/s; # extern "C" {のカッコが邪魔 + $intext =~ s/\#ifdef\s+__cplusplus\s+\}/\#ifdef __cplusplus\n\/* \} *\//s; + } + + { + # open2がおかしいのでベタに書くことにする + open OUTFILE, ">indent.tmp" or die "cannot open outfile indent.tmp\n"; + print OUTFILE $intext; + close(OUTFILE); + } + +$tpdefs = "\ +-T BOOL -T f64 -T u64 -T s64 -T f32 -T u32 -T s32 -T u16 -T s16 -T u8 -T s8 \ +-T VecFx16 -T VecFx32 -T OS_Thread -T OS_Mutex -T OS_MessageQueue -T OS_Context \ +-T MtxFx44 -T MtxFx43 -T MtxFx33 -T MtxFx22 -T LockWord -T LockByte -T G3XMiscStatus \ +-T G3DLInfo -T G3BoxTestParam -T G2OamAttr -T G2OamAffine -T fxdiv_ -T fx64Tmp_ \ +-T G2ENUM_OAM_SHAPE"; + +system "indent -bap -bbo -bli0 -bls -c60 -cd60 -cli0 -cp8 -nbfda -i4 -l120 -lc120 -lps -nbc -ncs -npsl -nsob -nut -npcs -nprs -saf -sai -saw -ss $tdefs indent.tmp"; + +open INFILE2, "indent.tmp" or die "cannot open infile indent.tmp\n"; + +$outtext = ""; +while() { + $outtext .= $_; +} + +unlink("indent.tmp"); +unlink("indent.tmp~"); + +close(INFILE2); + +{ + # outtext処理部 + $outtext =~ s/extern\s+\"C\";/extern \"C\" \{/s; # extern "C" {のカッコをつける + $outtext =~ s/\#ifdef\s+__cplusplus\s+\/\* \} \*\//\#ifdef __cplusplus\n\}/s; +} + +open OUTFILE2, ">$filename" or die "cannot open outfile $filename\n"; +print OUTFILE2 $outtext; +close(OUTFILE2); +} diff --git a/trunk/build/buildtools/template/Copyright.Header b/trunk/build/buildtools/template/Copyright.Header new file mode 100644 index 0000000..3ced904 --- /dev/null +++ b/trunk/build/buildtools/template/Copyright.Header @@ -0,0 +1,15 @@ +/*---------------------------------------------------------------------------* + Project: NitroSDK - OS - + File: XXXXXXXX.c + + Copyright 2008 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Log: $ + $NoKeywords: $ + *---------------------------------------------------------------------------*/ diff --git a/trunk/build/buildtools/template/Function.Header b/trunk/build/buildtools/template/Function.Header new file mode 100644 index 0000000..c1b77fe --- /dev/null +++ b/trunk/build/buildtools/template/Function.Header @@ -0,0 +1,12 @@ +/*---------------------------------------------------------------------------* + Name: OSExceptionInit + + Description: Performs exception initialization. + - installs the first level exception handlers + - set up exception table and common exception handler + + Arguments: installDBIntegrator if TRUE, copy OSDBIntegrator into + low memory. + + Returns: None. + *---------------------------------------------------------------------------*/ diff --git a/trunk/build/buildtools/template/Makefile.BuildSrc b/trunk/build/buildtools/template/Makefile.BuildSrc new file mode 100644 index 0000000..007dee2 --- /dev/null +++ b/trunk/build/buildtools/template/Makefile.BuildSrc @@ -0,0 +1,40 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: NitroSDK - - +# File: Makefile +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +SUBDIRS = + + +#---------------------------------------------------------------------------- + +SRCS = main.c +TARGET_BIN = main.srl + +#SRCDIR = # using default +#LCFILE = # using default + +include $(CTRSDK_ROOT)/build/buildtools/commondefs + + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + + +include $(CTRSDK_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/trunk/build/buildtools/template/Makefile.BuildSrc.ARM7 b/trunk/build/buildtools/template/Makefile.BuildSrc.ARM7 new file mode 100644 index 0000000..466781c --- /dev/null +++ b/trunk/build/buildtools/template/Makefile.BuildSrc.ARM7 @@ -0,0 +1,44 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: NitroSDK - - +# File: Makefile +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +SUBDIRS = + +#---------------------------------------------------------------------------- + +# Codegen for sub processer +CODEGEN_PROC = ARM9 + + +SRCS = main.c +TARGET_BIN = main.srl + + +#SRCDIR = +#LCFILE = + +include $(CTRSDK_ROOT)/build/buildtools/commondefs + + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + + +include $(CTRSDK_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/trunk/build/buildtools/template/Makefile.BuildSubdir b/trunk/build/buildtools/template/Makefile.BuildSubdir new file mode 100644 index 0000000..768e0da --- /dev/null +++ b/trunk/build/buildtools/template/Makefile.BuildSubdir @@ -0,0 +1,31 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: NitroSDK - - +# File: Makefile +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded instructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +include $(CTRSDK_ROOT)/build/buildtools/commondefs + + +#---------------------------------------------------------------------------- + +SUBDIRS = + + +#---------------------------------------------------------------------------- + +include $(CTRSDK_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/trunk/build/buildtools/verinfo.cw.cc b/trunk/build/buildtools/verinfo.cw.cc new file mode 100644 index 0000000..0288c3f --- /dev/null +++ b/trunk/build/buildtools/verinfo.cw.cc @@ -0,0 +1,3 @@ +SDK_CW_BUILD_VERSION_CC=3.0 +SDK_CW_BUILD_NUMBER_CC=137 +SDK_CW_BUILD_NUMBER2_CC=13700 diff --git a/trunk/build/buildtools/verinfo.cw.ld b/trunk/build/buildtools/verinfo.cw.ld new file mode 100644 index 0000000..f8513f3 --- /dev/null +++ b/trunk/build/buildtools/verinfo.cw.ld @@ -0,0 +1,3 @@ +SDK_CW_BUILD_VERSION_LD=2.0 +SDK_CW_BUILD_NUMBER_LD=87 +SDK_CW_BUILD_NUMBER2_LD=8700 diff --git a/trunk/build/buildtools/versiondefs b/trunk/build/buildtools/versiondefs new file mode 100644 index 0000000..2100cdb --- /dev/null +++ b/trunk/build/buildtools/versiondefs @@ -0,0 +1,20 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrSDK - versiondefs +# File: versiondefs +# +# Copyright 2008 Nintendo. All rights reserved. +# +# These coded insructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Log: $ +# $NoKeywords: $ +#---------------------------------------------------------------------------- + +-include $(NITROSDK_ROOT)/include/nitro/version.h + +#===== End of versiondefs ===== diff --git a/trunk/setup b/trunk/setup new file mode 100644 index 0000000..e02ebb5 --- /dev/null +++ b/trunk/setup @@ -0,0 +1,17 @@ +#!/usr/bin/bash + +#---------------------------------------------------------------- +# This script is not for execute directly. +# Please use 'source ./setup'. +#---------------------------------------------------------------- + +export CTRFIRM_ROOT=`cygpath -m $PWD` +export CTRBROM_ROOT=$CTRFIRM_ROOT/bootrom +export CTRSDK_ROOT=$CTRFIRM_ROOT +export CYGPATH_NOCMD='TRUE' + +echo "Set CTRFIRM_ROOT: $CTRFIRM_ROOT" +echo "Set CTRBROM_ROOT: $CTRBROM_ROOT" +echo "Set CTRSDK_ROOT: $CTRSDK_ROOT" +echo "Set CYGPATH_NOCMD: $CYGPATH_NOCMD" +