ICC profile, version 4: PHP parsing library

File extension

["icc", "icm"]

KS implementation details

License: CC0-1.0

References

This page hosts a formal specification of ICC profile, version 4 using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.

PHP source code to parse ICC profile, version 4

Icc4.php

<?php
// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild

namespace {
    class Icc4 extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root === null ? $this : $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_header = new \Icc4\ProfileHeader($this->_io, $this, $this->_root);
            $this->_m_tagTable = new \Icc4\TagTable($this->_io, $this, $this->_root);
        }
        protected $_m_header;
        protected $_m_tagTable;
        public function header() { return $this->_m_header; }
        public function tagTable() { return $this->_m_tagTable; }
    }
}

namespace Icc4 {
    class DateTimeNumber extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_year = $this->_io->readU2be();
            $this->_m_month = $this->_io->readU2be();
            $this->_m_day = $this->_io->readU2be();
            $this->_m_hour = $this->_io->readU2be();
            $this->_m_minute = $this->_io->readU2be();
            $this->_m_second = $this->_io->readU2be();
        }
        protected $_m_year;
        protected $_m_month;
        protected $_m_day;
        protected $_m_hour;
        protected $_m_minute;
        protected $_m_second;
        public function year() { return $this->_m_year; }
        public function month() { return $this->_m_month; }
        public function day() { return $this->_m_day; }
        public function hour() { return $this->_m_hour; }
        public function minute() { return $this->_m_minute; }
        public function second() { return $this->_m_second; }
    }
}

namespace Icc4 {
    class DeviceAttributes extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reflectiveOrTransparency = $this->_io->readBitsIntBe(1);
            $this->_m_glossyOrMatte = $this->_io->readBitsIntBe(1);
            $this->_m_positiveOrNegativeMediaPolarity = $this->_io->readBitsIntBe(1);
            $this->_m_colourOrBlackAndWhiteMedia = $this->_io->readBitsIntBe(1);
            $this->_m_reserved = $this->_io->readBitsIntBe(28);
            $this->_m_vendorSpecific = $this->_io->readBitsIntBe(32);
        }
        protected $_m_reflectiveOrTransparency;
        protected $_m_glossyOrMatte;
        protected $_m_positiveOrNegativeMediaPolarity;
        protected $_m_colourOrBlackAndWhiteMedia;
        protected $_m_reserved;
        protected $_m_vendorSpecific;
        public function reflectiveOrTransparency() { return $this->_m_reflectiveOrTransparency; }
        public function glossyOrMatte() { return $this->_m_glossyOrMatte; }
        public function positiveOrNegativeMediaPolarity() { return $this->_m_positiveOrNegativeMediaPolarity; }
        public function colourOrBlackAndWhiteMedia() { return $this->_m_colourOrBlackAndWhiteMedia; }
        public function reserved() { return $this->_m_reserved; }
        public function vendorSpecific() { return $this->_m_vendorSpecific; }
    }
}

namespace Icc4\DeviceAttributes {
    class DeviceAttributesColourOrBlackAndWhiteMedia {
        const COLOUR_MEDIA = 0;
        const BLACK_AND_WHITE_MEDIA = 1;

        private const _VALUES = [0 => true, 1 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\DeviceAttributes {
    class DeviceAttributesGlossyOrMatte {
        const GLOSSY = 0;
        const MATTE = 1;

        private const _VALUES = [0 => true, 1 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\DeviceAttributes {
    class DeviceAttributesPositiveOrNegativeMediaPolarity {
        const POSITIVE_MEDIA_POLARITY = 0;
        const NEGATIVE_MEDIA_POLARITY = 1;

        private const _VALUES = [0 => true, 1 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\DeviceAttributes {
    class DeviceAttributesReflectiveOrTransparency {
        const REFLECTIVE = 0;
        const TRANSPARENCY = 1;

        private const _VALUES = [0 => true, 1 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4 {
    class DeviceManufacturer extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_deviceManufacturer = $this->_io->readU4be();
        }
        protected $_m_deviceManufacturer;
        public function deviceManufacturer() { return $this->_m_deviceManufacturer; }
    }
}

namespace Icc4\DeviceManufacturer {
    class DeviceManufacturers {
        const ERDT_SYSTEMS_GMBH_AND_CO_KG = 878981744;
        const AAMAZING_TECHNOLOGIES_INC = 1094798657;
        const ACER_PERIPHERALS = 1094927698;
        const ACOLYTE_COLOR_RESEARCH = 1094929492;
        const ACTIX_SYTEMS_INC = 1094931529;
        const ADARA_TECHNOLOGY_INC = 1094992210;
        const ADOBE_SYSTEMS_INCORPORATED = 1094992453;
        const ADI_SYSTEMS_INC = 1094994208;
        const AGFA_GRAPHICS_NV = 1095190081;
        const ALPS_ELECTRIC_USA_INC = 1095519556;
        const ALPS_ELECTRIC_USA_INC_2 = 1095520339;
        const ALWAN_COLOR_EXPERTISE = 1095522126;
        const AMIABLE_TECHNOLOGIES_INC = 1095586889;
        const AOC_INTERNATIONAL_USA_LTD = 1095713568;
        const APAGO = 1095778631;
        const APPLE_COMPUTER_INC = 1095782476;
        const AST = 1095980064;
        const ATANDT_COMPUTER_SYSTEMS = 1096033876;
        const BARBIERI_ELECTRONIC = 1111573836;
        const BARCO_NV = 1112687439;
        const BREAKPOINT_PTY_LIMITED = 1112689488;
        const BROTHER_INDUSTRIES_LTD = 1112690516;
        const BULL = 1112886348;
        const BUS_COMPUTER_SYSTEMS = 1112888096;
        const C_ITOH = 1127041364;
        const INTEL_CORPORATION = 1128353106;
        const CANON_INC_CANON_DEVELOPMENT_AMERICAS_INC = 1128353359;
        const CARROLL_TOUCH = 1128354386;
        const CASIO_COMPUTER_CO_LTD = 1128354633;
        const COLORBUS_PL = 1128420691;
        const CROSSFIELD = 1128614944;
        const CROSSFIELD_2 = 1128615032;
        const CGS_PUBLISHING_TECHNOLOGIES_INTERNATIONAL_GMBH = 1128747808;
        const ROCHESTER_ROBOTICS = 1128811808;
        const COLOUR_IMAGING_GROUP_LONDON = 1128875852;
        const CITIZEN = 1128879177;
        const CANDELA_LTD = 1129066544;
        const COLOR_IQ = 1129072977;
        const CHROMACO_INC = 1129136975;
        const CHROMIX = 1129146712;
        const COLORGRAPHIC_COMMUNICATIONS_CORPORATION = 1129270351;
        const COMPAQ_COMPUTER_CORPORATION = 1129270608;
        const COMPEQ_USA_FOCUS_TECHNOLOGY = 1129270640;
        const CONRAC_DISPLAY_PRODUCTS = 1129270866;
        const CORDATA_TECHNOLOGIES_INC = 1129271876;
        const COMPAQ_COMPUTER_CORPORATION_2 = 1129337120;
        const COLORPRO = 1129337423;
        const CORNERSTONE = 1129467424;
        const CTX_INTERNATIONAL_INC = 1129601056;
        const COLORVISION = 1129728339;
        const FUJITSU_LABORATORIES_LTD = 1129792288;
        const DARIUS_TECHNOLOGY_LTD = 1145131593;
        const DATAPRODUCTS = 1145132097;
        const DRY_CREEK_PHOTO = 1145262112;
        const DIGITAL_CONTENTS_RESOURCE_CENTER_CHUNG_ANG_UNIVERSITY = 1145262659;
        const DELL_COMPUTER_CORPORATION = 1145392204;
        const DAINIPPON_INK_AND_CHEMICALS = 1145652000;
        const DICONIX = 1145652047;
        const DIGITAL = 1145653065;
        const DIGITAL_LIGHT_AND_COLOR = 1145841219;
        const DOPPELGANGER_LLC = 1146113095;
        const DAINIPPON_SCREEN = 1146298400;
        const DOOSOL = 1146310476;
        const DUPONT = 1146441806;
        const EPSON = 1162892111;
        const ESKO_GRAPHICS = 1163086671;
        const ELECTRONICS_AND_TELECOMMUNICATIONS_RESEARCH_INSTITUTE = 1163153993;
        const EVEREX_SYSTEMS_INC = 1163281746;
        const EXACTCODE_GMBH = 1163411779;
        const EIZO_NANAO_CORPORATION = 1164540527;
        const FALCO_DATA_PRODUCTS_INC = 1178684483;
        const FUJI_PHOTO_FILM_COLTD = 1179000864;
        const FUJIFILM_ELECTRONIC_IMAGING_LTD = 1179010377;
        const FNORD_SOFTWARE = 1179537988;
        const FORA_INC = 1179603521;
        const FOREFRONT_TECHNOLOGY_CORPORATION = 1179603525;
        const FUJITSU = 1179658794;
        const WAYTECH_DEVELOPMENT_INC = 1179664672;
        const FUJITSU_2 = 1179994697;
        const FUJI_XEROX_CO_LTD = 1180180512;
        const GCC_TECHNOLOGIES_INC = 1195590432;
        const GLOBAL_GRAPHICS_SOFTWARE_LIMITED = 1195856716;
        const GRETAGMACBETH = 1196245536;
        const GMG_GMBH_AND_CO_KG = 1196246816;
        const GOLDSTAR_TECHNOLOGY_INC = 1196379204;
        const GIANTPRINT_PTY_LTD = 1196446292;
        const GRETAGMACBETH_2 = 1196707138;
        const WAYTECH_DEVELOPMENT_INC_2 = 1196835616;
        const SONY_CORPORATION = 1196896843;
        const HCI = 1212369184;
        const HEIDELBERGER_DRUCKMASCHINEN_AG = 1212435744;
        const HERMES = 1212502605;
        const HITACHI_AMERICA_LTD = 1212765249;
        const HEWLETT_PACKARD = 1213210656;
        const HITACHI_LTD = 1213481760;
        const HITI_DIGITAL_INC = 1214862441;
        const IBM_CORPORATION = 1229081888;
        const SCITEX_CORPORATION_LTD = 1229213268;
        const HEWLETT_PACKARD_2 = 1229275936;
        const IIYAMA_NORTH_AMERICA_INC = 1229543745;
        const IKEGAMI_ELECTRONICS_INC = 1229669703;
        const IMAGE_SYSTEMS_CORPORATION = 1229799751;
        const INGRAM_MICRO_INC = 1229801760;
        const INTEL_CORPORATION_2 = 1229870147;
        const INTL = 1229870156;
        const INTRA_ELECTRONICS_USA_INC = 1229870162;
        const IOCOMM_INTERNATIONAL_TECHNOLOGY_CORPORATION = 1229931343;
        const INFOPRINT_SOLUTIONS_COMPANY = 1230000928;
        const SCITEX_CORPORATION_LTD_3 = 1230129491;
        const ICHIKAWA_SOFT_LABORATORY = 1230195744;
        const ITNL = 1230261836;
        const IVM = 1230392608;
        const IWATSU_ELECTRIC_CO_LTD = 1230455124;
        const SCITEX_CORPORATION_LTD_2 = 1231318644;
        const INCA_DIGITAL_PRINTERS_LTD = 1231971169;
        const SCITEX_CORPORATION_LTD_4 = 1232234867;
        const JETSOFT_DEVELOPMENT = 1246971476;
        const JVC_INFORMATION_PRODUCTS_CO = 1247167264;
        const SCITEX_CORPORATION_LTD_6 = 1262572116;
        const KFC_COMPUTEK_COMPONENTS_CORPORATION = 1262895904;
        const KLH_COMPUTERS = 1263290400;
        const KONICA_MINOLTA_HOLDINGS_INC = 1263355972;
        const KONICA_CORPORATION = 1263420225;
        const KODAK = 1263486017;
        const KYOCERA = 1264144195;
        const SCITEX_CORPORATION_LTD_7 = 1264677492;
        const LEICA_CAMERA_AG = 1279476039;
        const LEEDS_COLOUR = 1279476548;
        const LEFT_DAKOTA = 1279541579;
        const LEADING_TECHNOLOGY_INC = 1279607108;
        const LEXMARK_INTERNATIONAL_INC = 1279613005;
        const LINK_COMPUTER_INC = 1279872587;
        const LINOTRONIC = 1279872591;
        const LITE_ON_INC = 1279874117;
        const MAG_COMPUTRONIC_USA_INC = 1296123715;
        const MAG_INNOVISION_INC = 1296123721;
        const MANNESMANN = 1296125518;
        const MICRON_TECHNOLOGY_INC = 1296646990;
        const MICROTEK = 1296646994;
        const MICROVITEC_INC = 1296646998;
        const MINOLTA = 1296649807;
        const MITSUBISHI_ELECTRONICS_AMERICA_INC = 1296651347;
        const MITSUBA_CORPORATION = 1296651379;
        const MINOLTA_2 = 1296976980;
        const MODGRAPH_INC = 1297040455;
        const MONITRONIX_INC = 1297043017;
        const MONACO_SYSTEMS_INC = 1297043027;
        const MORSE_TECHNOLOGY_INC = 1297044051;
        const MOTIVE_SYSTEMS = 1297044553;
        const MICROSOFT_CORPORATION = 1297303124;
        const MUTOH_INDUSTRIES_LTD = 1297437775;
        const MITSUBISHI_ELECTRIC_CORPORATION_KYOTO_WORKS = 1298756723;
        const NANAO_USA_CORPORATION = 1312902721;
        const NEC_CORPORATION = 1313162016;
        const NEXPRESS_SOLUTIONS_LLC = 1313167440;
        const NISSEI_SANGYO_AMERICA_LTD = 1313428307;
        const NIKON_CORPORATION = 1313558350;
        const OCE_TECHNOLOGIES_BV = 1329808672;
        const OCECOLOR = 1329808707;
        const OKI = 1330333984;
        const OKIDATA = 1330334020;
        const OKIDATA_2 = 1330334032;
        const OLIVETTI = 1330399574;
        const OLYMPUS_OPTICAL_CO_LTD = 1330403661;
        const ONYX_GRAPHICS = 1330534744;
        const OPTIQUEST = 1330664521;
        const PACKARD_BELL = 1346454347;
        const MATSUSHITA_ELECTRIC_INDUSTRIAL_CO_LTD = 1346457153;
        const PANTONE_INC = 1346457172;
        const PACKARD_BELL_2 = 1346522656;
        const PFU_LIMITED = 1346786592;
        const PHILIPS_CONSUMER_ELECTRONICS_CO = 1346914636;
        const HOYA_CORPORATION_PENTAX_IMAGING_SYSTEMS_DIVISION = 1347310680;
        const PHASE_ONE_A_S = 1347382885;
        const PREMIER_COMPUTER_INNOVATIONS = 1347568973;
        const PRINCETON_GRAPHIC_SYSTEMS = 1347569998;
        const PRINCETON_PUBLISHING_LABS = 1347570000;
        const QLUX = 1363957080;
        const QMS_INC = 1364022048;
        const QPCARD_AB = 1364214596;
        const QUADLASER = 1364541764;
        const QUME_CORPORATION = 1364544837;
        const RADIUS_INC = 1380009033;
        const INTEGRATED_COLOR_SOLUTIONS_INC_2 = 1380205688;
        const ROLAND_DG_CORPORATION = 1380206368;
        const REDMS_GROUP_INC = 1380271181;
        const RELISYS = 1380273225;
        const ROLF_GIERLING_MULTITOOLS = 1380404563;
        const RICOH_CORPORATION = 1380533071;
        const EDMUND_RONALD = 1380863044;
        const ROYAL = 1380931905;
        const RICOH_PRINTING_SYSTEMSLTD = 1380991776;
        const ROYAL_INFORMATION_ELECTRONICS_CO_LTD = 1381256224;
        const SAMPO_CORPORATION_OF_AMERICA = 1396788560;
        const SAMSUNG_INC = 1396788563;
        const JAIME_SANTANA_POMARES = 1396788820;
        const SCITEX_CORPORATION_LTD_9 = 1396918612;
        const DAINIPPON_SCREEN_3 = 1396920910;
        const SCITEX_CORPORATION_LTD_12 = 1396985888;
        const SAMSUNG_ELECTRONICS_COLTD = 1397048096;
        const SEIKO_INSTRUMENTS_USA_INC = 1397049675;
        const SEIKOSHA = 1397049707;
        const SCANGUYCOM = 1397183833;
        const SHARP_LABORATORIES = 1397244242;
        const INTERNATIONAL_COLOR_CONSORTIUM = 1397310275;
        const SONY_CORPORATION_2 = 1397706329;
        const SPECTRACAL = 1397769036;
        const STAR = 1398030674;
        const SAMPO_TECHNOLOGY_CORPORATION = 1398031136;
        const SCITEX_CORPORATION_LTD_10 = 1399023988;
        const SCITEX_CORPORATION_LTD_13 = 1399091232;
        const SONY_CORPORATION_3 = 1399811705;
        const TALON_TECHNOLOGY_CORPORATION = 1413565519;
        const TANDY = 1413566020;
        const TATUNG_CO_OF_AMERICA_INC = 1413567573;
        const TAXAN_AMERICA_INC = 1413568577;
        const TOKYO_DENSHI_SEKEI_KK = 1413763872;
        const TECO_INFORMATION_SYSTEMS_INC = 1413825359;
        const TEGRA = 1413826386;
        const TEKTRONIX_INC = 1413827412;
        const TEXAS_INSTRUMENTS = 1414078496;
        const TYPEMAKER_LTD = 1414351698;
        const TOSHIBA_CORP = 1414484802;
        const TOSHIBA_INC = 1414484808;
        const TOTOKU_ELECTRIC_CO_LTD = 1414485067;
        const TRIUMPH = 1414678869;
        const TOSHIBA_TEC_CORPORATION = 1414742612;
        const TTX_COMPUTER_PRODUCTS_INC = 1414813728;
        const TVM_PROFESSIONAL_MONITOR_CORPORATION = 1414941984;
        const TW_CASPER_CORPORATION = 1414996000;
        const ULEAD_SYSTEMS = 1431065432;
        const UNISYS = 1431193939;
        const UTZ_FEHLAU_AND_SOHN = 1431591494;
        const VARITYPER = 1447121481;
        const VIEWSONIC = 1447642455;
        const VISUAL_COMMUNICATION = 1447646028;
        const WANG = 1463897671;
        const WILBUR_IMAGING = 1464615506;
        const WARE_TO_GO = 1465141042;
        const WYSE_TECHNOLOGY = 1465471813;
        const XEROX_CORPORATION = 1480938072;
        const X_RITE = 1481787732;
        const LAVANYAS_TEST_COMPANY = 1513173555;
        const ZORAN_CORPORATION = 1515340110;
        const ZEBRA_TECHNOLOGIES_INC = 1516593778;
        const BASICCOLOR_GMBH = 1648968515;
        const BERGDESIGN_INCORPORATED = 1650815591;
        const INTEGRATED_COLOR_SOLUTIONS_INC = 1667594596;
        const MACDERMID_COLORSPAN_INC = 1668051824;
        const DAINIPPON_SCREEN_2 = 1685266464;
        const DUPONT_2 = 1685418094;
        const FUJIFILM_ELECTRONIC_IMAGING_LTD_2 = 1717986665;
        const FLUXDATA_CORPORATION = 1718383992;
        const SCITEX_CORPORATION_LTD_5 = 1769105779;
        const SCITEX_CORPORATION_LTD_8 = 1801548404;
        const ERDT_SYSTEMS_GMBH_AND_CO_KG_2 = 1868706916;
        const MEDIGRAPH_GMBH = 1868720483;
        const QUBYX_SARL = 1903518329;
        const SCITEX_CORPORATION_LTD_11 = 1935894900;
        const DAINIPPON_SCREEN_4 = 1935897198;
        const SCITEX_CORPORATION_LTD_14 = 1935962144;
        const SIWI_GRAFIKA_CORPORATION = 1936291689;
        const YXYMASTER_GMBH = 2037938541;

        private const _VALUES = [878981744 => true, 1094798657 => true, 1094927698 => true, 1094929492 => true, 1094931529 => true, 1094992210 => true, 1094992453 => true, 1094994208 => true, 1095190081 => true, 1095519556 => true, 1095520339 => true, 1095522126 => true, 1095586889 => true, 1095713568 => true, 1095778631 => true, 1095782476 => true, 1095980064 => true, 1096033876 => true, 1111573836 => true, 1112687439 => true, 1112689488 => true, 1112690516 => true, 1112886348 => true, 1112888096 => true, 1127041364 => true, 1128353106 => true, 1128353359 => true, 1128354386 => true, 1128354633 => true, 1128420691 => true, 1128614944 => true, 1128615032 => true, 1128747808 => true, 1128811808 => true, 1128875852 => true, 1128879177 => true, 1129066544 => true, 1129072977 => true, 1129136975 => true, 1129146712 => true, 1129270351 => true, 1129270608 => true, 1129270640 => true, 1129270866 => true, 1129271876 => true, 1129337120 => true, 1129337423 => true, 1129467424 => true, 1129601056 => true, 1129728339 => true, 1129792288 => true, 1145131593 => true, 1145132097 => true, 1145262112 => true, 1145262659 => true, 1145392204 => true, 1145652000 => true, 1145652047 => true, 1145653065 => true, 1145841219 => true, 1146113095 => true, 1146298400 => true, 1146310476 => true, 1146441806 => true, 1162892111 => true, 1163086671 => true, 1163153993 => true, 1163281746 => true, 1163411779 => true, 1164540527 => true, 1178684483 => true, 1179000864 => true, 1179010377 => true, 1179537988 => true, 1179603521 => true, 1179603525 => true, 1179658794 => true, 1179664672 => true, 1179994697 => true, 1180180512 => true, 1195590432 => true, 1195856716 => true, 1196245536 => true, 1196246816 => true, 1196379204 => true, 1196446292 => true, 1196707138 => true, 1196835616 => true, 1196896843 => true, 1212369184 => true, 1212435744 => true, 1212502605 => true, 1212765249 => true, 1213210656 => true, 1213481760 => true, 1214862441 => true, 1229081888 => true, 1229213268 => true, 1229275936 => true, 1229543745 => true, 1229669703 => true, 1229799751 => true, 1229801760 => true, 1229870147 => true, 1229870156 => true, 1229870162 => true, 1229931343 => true, 1230000928 => true, 1230129491 => true, 1230195744 => true, 1230261836 => true, 1230392608 => true, 1230455124 => true, 1231318644 => true, 1231971169 => true, 1232234867 => true, 1246971476 => true, 1247167264 => true, 1262572116 => true, 1262895904 => true, 1263290400 => true, 1263355972 => true, 1263420225 => true, 1263486017 => true, 1264144195 => true, 1264677492 => true, 1279476039 => true, 1279476548 => true, 1279541579 => true, 1279607108 => true, 1279613005 => true, 1279872587 => true, 1279872591 => true, 1279874117 => true, 1296123715 => true, 1296123721 => true, 1296125518 => true, 1296646990 => true, 1296646994 => true, 1296646998 => true, 1296649807 => true, 1296651347 => true, 1296651379 => true, 1296976980 => true, 1297040455 => true, 1297043017 => true, 1297043027 => true, 1297044051 => true, 1297044553 => true, 1297303124 => true, 1297437775 => true, 1298756723 => true, 1312902721 => true, 1313162016 => true, 1313167440 => true, 1313428307 => true, 1313558350 => true, 1329808672 => true, 1329808707 => true, 1330333984 => true, 1330334020 => true, 1330334032 => true, 1330399574 => true, 1330403661 => true, 1330534744 => true, 1330664521 => true, 1346454347 => true, 1346457153 => true, 1346457172 => true, 1346522656 => true, 1346786592 => true, 1346914636 => true, 1347310680 => true, 1347382885 => true, 1347568973 => true, 1347569998 => true, 1347570000 => true, 1363957080 => true, 1364022048 => true, 1364214596 => true, 1364541764 => true, 1364544837 => true, 1380009033 => true, 1380205688 => true, 1380206368 => true, 1380271181 => true, 1380273225 => true, 1380404563 => true, 1380533071 => true, 1380863044 => true, 1380931905 => true, 1380991776 => true, 1381256224 => true, 1396788560 => true, 1396788563 => true, 1396788820 => true, 1396918612 => true, 1396920910 => true, 1396985888 => true, 1397048096 => true, 1397049675 => true, 1397049707 => true, 1397183833 => true, 1397244242 => true, 1397310275 => true, 1397706329 => true, 1397769036 => true, 1398030674 => true, 1398031136 => true, 1399023988 => true, 1399091232 => true, 1399811705 => true, 1413565519 => true, 1413566020 => true, 1413567573 => true, 1413568577 => true, 1413763872 => true, 1413825359 => true, 1413826386 => true, 1413827412 => true, 1414078496 => true, 1414351698 => true, 1414484802 => true, 1414484808 => true, 1414485067 => true, 1414678869 => true, 1414742612 => true, 1414813728 => true, 1414941984 => true, 1414996000 => true, 1431065432 => true, 1431193939 => true, 1431591494 => true, 1447121481 => true, 1447642455 => true, 1447646028 => true, 1463897671 => true, 1464615506 => true, 1465141042 => true, 1465471813 => true, 1480938072 => true, 1481787732 => true, 1513173555 => true, 1515340110 => true, 1516593778 => true, 1648968515 => true, 1650815591 => true, 1667594596 => true, 1668051824 => true, 1685266464 => true, 1685418094 => true, 1717986665 => true, 1718383992 => true, 1769105779 => true, 1801548404 => true, 1868706916 => true, 1868720483 => true, 1903518329 => true, 1935894900 => true, 1935897198 => true, 1935962144 => true, 1936291689 => true, 2037938541 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4 {
    class PositionNumber extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_offsetToDataElement = $this->_io->readU4be();
            $this->_m_sizeOfDataElement = $this->_io->readU4be();
        }
        protected $_m_offsetToDataElement;
        protected $_m_sizeOfDataElement;
        public function offsetToDataElement() { return $this->_m_offsetToDataElement; }
        public function sizeOfDataElement() { return $this->_m_sizeOfDataElement; }
    }
}

namespace Icc4 {
    class ProfileHeader extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4 $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_size = $this->_io->readU4be();
            $this->_m_preferredCmmType = $this->_io->readU4be();
            $this->_m_version = new \Icc4\ProfileHeader\VersionField($this->_io, $this, $this->_root);
            $this->_m_deviceClass = $this->_io->readU4be();
            $this->_m_colorSpace = $this->_io->readU4be();
            $this->_m_pcs = \Kaitai\Struct\Stream::bytesToStr($this->_io->readBytes(4), "ASCII");
            $this->_m_creationDateTime = new \Icc4\DateTimeNumber($this->_io, $this, $this->_root);
            $this->_m_fileSignature = $this->_io->readBytes(4);
            if (!($this->_m_fileSignature == "\x61\x63\x73\x70")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x61\x63\x73\x70", $this->_m_fileSignature, $this->_io, "/types/profile_header/seq/7");
            }
            $this->_m_primaryPlatform = $this->_io->readU4be();
            $this->_m_profileFlags = new \Icc4\ProfileHeader\ProfileFlags($this->_io, $this, $this->_root);
            $this->_m_deviceManufacturer = new \Icc4\DeviceManufacturer($this->_io, $this, $this->_root);
            $this->_m_deviceModel = \Kaitai\Struct\Stream::bytesToStr($this->_io->readBytes(4), "ASCII");
            $this->_m_deviceAttributes = new \Icc4\DeviceAttributes($this->_io, $this, $this->_root);
            $this->_m_renderingIntent = $this->_io->readU4be();
            $this->_m_nciexyzValuesOfIlluminantOfPcs = new \Icc4\XyzNumber($this->_io, $this, $this->_root);
            $this->_m_creator = new \Icc4\DeviceManufacturer($this->_io, $this, $this->_root);
            $this->_m_identifier = $this->_io->readBytes(16);
            $this->_m_reservedData = $this->_io->readBytes(28);
        }
        protected $_m_size;
        protected $_m_preferredCmmType;
        protected $_m_version;
        protected $_m_deviceClass;
        protected $_m_colorSpace;
        protected $_m_pcs;
        protected $_m_creationDateTime;
        protected $_m_fileSignature;
        protected $_m_primaryPlatform;
        protected $_m_profileFlags;
        protected $_m_deviceManufacturer;
        protected $_m_deviceModel;
        protected $_m_deviceAttributes;
        protected $_m_renderingIntent;
        protected $_m_nciexyzValuesOfIlluminantOfPcs;
        protected $_m_creator;
        protected $_m_identifier;
        protected $_m_reservedData;
        public function size() { return $this->_m_size; }
        public function preferredCmmType() { return $this->_m_preferredCmmType; }
        public function version() { return $this->_m_version; }
        public function deviceClass() { return $this->_m_deviceClass; }
        public function colorSpace() { return $this->_m_colorSpace; }
        public function pcs() { return $this->_m_pcs; }
        public function creationDateTime() { return $this->_m_creationDateTime; }
        public function fileSignature() { return $this->_m_fileSignature; }
        public function primaryPlatform() { return $this->_m_primaryPlatform; }
        public function profileFlags() { return $this->_m_profileFlags; }
        public function deviceManufacturer() { return $this->_m_deviceManufacturer; }
        public function deviceModel() { return $this->_m_deviceModel; }
        public function deviceAttributes() { return $this->_m_deviceAttributes; }
        public function renderingIntent() { return $this->_m_renderingIntent; }
        public function nciexyzValuesOfIlluminantOfPcs() { return $this->_m_nciexyzValuesOfIlluminantOfPcs; }
        public function creator() { return $this->_m_creator; }
        public function identifier() { return $this->_m_identifier; }
        public function reservedData() { return $this->_m_reservedData; }
    }
}

namespace Icc4\ProfileHeader {
    class ProfileFlags extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\ProfileHeader $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_embeddedProfile = $this->_io->readBitsIntBe(1) != 0;
            $this->_m_profileCanBeUsedIndependentlyOfEmbeddedColourData = $this->_io->readBitsIntBe(1) != 0;
            $this->_m_otherFlags = $this->_io->readBitsIntBe(30);
        }
        protected $_m_embeddedProfile;
        protected $_m_profileCanBeUsedIndependentlyOfEmbeddedColourData;
        protected $_m_otherFlags;
        public function embeddedProfile() { return $this->_m_embeddedProfile; }
        public function profileCanBeUsedIndependentlyOfEmbeddedColourData() { return $this->_m_profileCanBeUsedIndependentlyOfEmbeddedColourData; }
        public function otherFlags() { return $this->_m_otherFlags; }
    }
}

namespace Icc4\ProfileHeader {
    class VersionField extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\ProfileHeader $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_major = $this->_io->readBytes(1);
            if (!($this->_m_major == "\x04")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x04", $this->_m_major, $this->_io, "/types/profile_header/types/version_field/seq/0");
            }
            $this->_m_minor = $this->_io->readBitsIntBe(4);
            $this->_m_bugFixLevel = $this->_io->readBitsIntBe(4);
            $this->_io->alignToByte();
            $this->_m_reserved = $this->_io->readBytes(2);
            if (!($this->_m_reserved == "\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00", $this->_m_reserved, $this->_io, "/types/profile_header/types/version_field/seq/3");
            }
        }
        protected $_m_major;
        protected $_m_minor;
        protected $_m_bugFixLevel;
        protected $_m_reserved;
        public function major() { return $this->_m_major; }
        public function minor() { return $this->_m_minor; }
        public function bugFixLevel() { return $this->_m_bugFixLevel; }
        public function reserved() { return $this->_m_reserved; }
    }
}

namespace Icc4\ProfileHeader {
    class CmmSignatures {
        const THE_IMAGING_FACTORY_CMM = 858931796;
        const AGFA_CMM = 1094929747;
        const ADOBE_CMM = 1094992453;
        const COLOR_GEAR_CMM = 1128484179;
        const DEMOICCMAX_CMM = 1145654616;
        const LOGOSYNC_CMM = 1147629395;
        const EFI_CMM = 1162234144;
        const EXACT_SCAN_CMM = 1163411779;
        const FUJI_FILM_CMM = 1179000864;
        const HARLEQUIN_RIP_CMM = 1212370253;
        const HEIDELBERG_CMM = 1212435744;
        const KODAK_CMM = 1262701907;
        const KONICA_MINOLTA_CMM = 1296256324;
        const ONYX_GRAPHICS_CMM = 1330534744;
        const DEVICE_LINK_CMM = 1380404563;
        const REFICCMAX_CMM = 1380535640;
        const SAMPLE_ICC_CMM = 1397310275;
        const MUTOH_CMM = 1397311310;
        const TOSHIBA_CMM = 1413696845;
        const COLOR_GEAR_CMM_LITE = 1430471501;
        const COLOR_GEAR_CMM_C = 1430474067;
        const WINDOWS_COLOR_SYSTEM_CMM = 1464029984;
        const WARE_TO_GO_CMM = 1465141024;
        const APPLE_CMM = 1634758764;
        const ARGYLL_CMS_CMM = 1634887532;
        const LITTLE_CMS_CMM = 1818455411;
        const VIVO_CMM = 1986623087;
        const ZORAN_CMM = 2053320752;

        private const _VALUES = [858931796 => true, 1094929747 => true, 1094992453 => true, 1128484179 => true, 1145654616 => true, 1147629395 => true, 1162234144 => true, 1163411779 => true, 1179000864 => true, 1212370253 => true, 1212435744 => true, 1262701907 => true, 1296256324 => true, 1330534744 => true, 1380404563 => true, 1380535640 => true, 1397310275 => true, 1397311310 => true, 1413696845 => true, 1430471501 => true, 1430474067 => true, 1464029984 => true, 1465141024 => true, 1634758764 => true, 1634887532 => true, 1818455411 => true, 1986623087 => true, 2053320752 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\ProfileHeader {
    class DataColourSpaces {
        const TWO_COLOUR = 843271250;
        const THREE_COLOUR = 860048466;
        const FOUR_COLOUR = 876825682;
        const FIVE_COLOUR = 893602898;
        const SIX_COLOUR = 910380114;
        const SEVEN_COLOUR = 927157330;
        const EIGHT_COLOUR = 943934546;
        const NINE_COLOUR = 960711762;
        const TEN_COLOUR = 1094929490;
        const ELEVEN_COLOUR = 1111706706;
        const TWELVE_COLOUR = 1128483922;
        const CMY = 1129142560;
        const CMYK = 1129142603;
        const THIRTEEN_COLOUR = 1145261138;
        const FOURTEEN_COLOUR = 1162038354;
        const FIFTEEN_COLOUR = 1178815570;
        const GRAY = 1196573017;
        const HLS = 1212961568;
        const HSV = 1213421088;
        const CIELAB_OR_PCSLAB = 1281450528;
        const CIELUV = 1282766368;
        const RGB = 1380401696;
        const NCIEXYZ_OR_PCSXYZ = 1482250784;
        const YCBCR = 1497588338;
        const CIEYXY = 1501067552;

        private const _VALUES = [843271250 => true, 860048466 => true, 876825682 => true, 893602898 => true, 910380114 => true, 927157330 => true, 943934546 => true, 960711762 => true, 1094929490 => true, 1111706706 => true, 1128483922 => true, 1129142560 => true, 1129142603 => true, 1145261138 => true, 1162038354 => true, 1178815570 => true, 1196573017 => true, 1212961568 => true, 1213421088 => true, 1281450528 => true, 1282766368 => true, 1380401696 => true, 1482250784 => true, 1497588338 => true, 1501067552 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\ProfileHeader {
    class PrimaryPlatforms {
        const APPLE_COMPUTER_INC = 1095782476;
        const MICROSOFT_CORPORATION = 1297303124;
        const SILICON_GRAPHICS_INC = 1397180704;
        const SUN_MICROSYSTEMS = 1398099543;

        private const _VALUES = [1095782476 => true, 1297303124 => true, 1397180704 => true, 1398099543 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\ProfileHeader {
    class ProfileClasses {
        const ABSTRACT_PROFILE = 1633842036;
        const DEVICE_LINK_PROFILE = 1818848875;
        const DISPLAY_DEVICE_PROFILE = 1835955314;
        const NAMED_COLOR_PROFILE = 1852662636;
        const OUTPUT_DEVICE_PROFILE = 1886549106;
        const INPUT_DEVICE_PROFILE = 1935896178;
        const COLOR_SPACE_PROFILE = 1936744803;

        private const _VALUES = [1633842036 => true, 1818848875 => true, 1835955314 => true, 1852662636 => true, 1886549106 => true, 1935896178 => true, 1936744803 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\ProfileHeader {
    class RenderingIntents {
        const PERCEPTUAL = 0;
        const MEDIA_RELATIVE_COLORIMETRIC = 1;
        const SATURATION = 2;
        const ICC_ABSOLUTE_COLORIMETRIC = 3;

        private const _VALUES = [0 => true, 1 => true, 2 => true, 3 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4 {
    class Response16Number extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_number = $this->_io->readU4be();
            $this->_m_reserved = $this->_io->readBytes(2);
            if (!($this->_m_reserved == "\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00", $this->_m_reserved, $this->_io, "/types/response_16_number/seq/1");
            }
            $this->_m_measurementValue = new \Icc4\S15Fixed16Number($this->_io, $this, $this->_root);
        }
        protected $_m_number;
        protected $_m_reserved;
        protected $_m_measurementValue;
        public function number() { return $this->_m_number; }
        public function reserved() { return $this->_m_reserved; }
        public function measurementValue() { return $this->_m_measurementValue; }
    }
}

namespace Icc4 {
    class S15Fixed16Number extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_number = $this->_io->readBytes(4);
        }
        protected $_m_number;
        public function number() { return $this->_m_number; }
    }
}

namespace Icc4 {
    class StandardIlluminantEncoding extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_standardIlluminantEncoding = $this->_io->readU4be();
        }
        protected $_m_standardIlluminantEncoding;
        public function standardIlluminantEncoding() { return $this->_m_standardIlluminantEncoding; }
    }
}

namespace Icc4\StandardIlluminantEncoding {
    class StandardIlluminantEncodings {
        const UNKNOWN = 0;
        const D50 = 1;
        const D65 = 2;
        const D93 = 3;
        const F2 = 4;
        const D55 = 5;
        const A = 6;
        const EQUI_POWER = 7;
        const F8 = 8;

        private const _VALUES = [0 => true, 1 => true, 2 => true, 3 => true, 4 => true, 5 => true, 6 => true, 7 => true, 8 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4 {
    class TagTable extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4 $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagCount = $this->_io->readU4be();
            $this->_m_tags = [];
            $n = $this->tagCount();
            for ($i = 0; $i < $n; $i++) {
                $this->_m_tags[] = new \Icc4\TagTable\TagDefinition($this->_io, $this, $this->_root);
            }
        }
        protected $_m_tagCount;
        protected $_m_tags;
        public function tagCount() { return $this->_m_tagCount; }
        public function tags() { return $this->_m_tags; }
    }
}

namespace Icc4\TagTable {
    class TagDefinition extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagSignature = $this->_io->readU4be();
            $this->_m_offsetToDataElement = $this->_io->readU4be();
            $this->_m_sizeOfDataElement = $this->_io->readU4be();
        }
        protected $_m_tagDataElement;
        public function tagDataElement() {
            if ($this->_m_tagDataElement !== null)
                return $this->_m_tagDataElement;
            $_pos = $this->_io->pos();
            $this->_io->seek($this->offsetToDataElement());
            switch ($this->tagSignature()) {
                case \Icc4\TagTable\TagDefinition\TagSignatures::A_TO_B_0:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\AToB0Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::A_TO_B_1:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\AToB1Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::A_TO_B_2:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\AToB2Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::B_TO_A_0:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\BToA0Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::B_TO_A_1:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\BToA1Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::B_TO_A_2:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\BToA2Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::B_TO_D_0:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\BToD0Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::B_TO_D_1:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\BToD1Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::B_TO_D_2:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\BToD2Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::B_TO_D_3:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\BToD3Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::BLUE_MATRIX_COLUMN:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\BlueMatrixColumnTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::BLUE_TRC:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\BlueTrcTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::CALIBRATION_DATE_TIME:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\CalibrationDateTimeTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::CHAR_TARGET:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\CharTargetTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::CHROMATIC_ADAPTATION:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\ChromaticAdaptationTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::CHROMATICITY:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\ChromaticityTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::COLORANT_ORDER:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\ColorantOrderTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::COLORANT_TABLE:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\ColorantTableTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::COLORANT_TABLE_OUT:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\ColorantTableOutTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::COLORIMETRIC_INTENT_IMAGE_STATE:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\ColorimetricIntentImageStateTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::COPYRIGHT:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\CopyrightTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::D_TO_B_0:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\DToB0Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::D_TO_B_1:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\DToB1Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::D_TO_B_2:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\DToB2Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::D_TO_B_3:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\DToB3Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::DEVICE_MFG_DESC:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\DeviceMfgDescTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::DEVICE_MODEL_DESC:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\DeviceModelDescTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::GAMUT:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\GamutTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::GRAY_TRC:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\GrayTrcTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::GREEN_MATRIX_COLUMN:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\GreenMatrixColumnTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::GREEN_TRC:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\GreenTrcTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::LUMINANCE:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\LuminanceTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::MEASUREMENT:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\MeasurementTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::MEDIA_WHITE_POINT:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\MediaWhitePointTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::NAMED_COLOR_2:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\NamedColor2Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::OUTPUT_RESPONSE:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\OutputResponseTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::PERCEPTUAL_RENDERING_INTENT_GAMUT:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\PerceptualRenderingIntentGamutTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::PREVIEW_0:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\Preview0Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::PREVIEW_1:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\Preview1Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::PREVIEW_2:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\Preview2Tag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::PROFILE_DESCRIPTION:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\ProfileDescriptionTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::PROFILE_SEQUENCE:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\ProfileSequenceTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::PROFILE_SEQUENCE_IDENTIFIER:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\ProfileSequenceIdentifierTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::RED_MATRIX_COLUMN:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\RedMatrixColumnTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::RED_TRC:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\RedTrcTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::SATURATION_RENDERING_INTENT_GAMUT:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\SaturationRenderingIntentGamutTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::TECHNOLOGY:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\TechnologyTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::VIEWING_COND_DESC:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\ViewingCondDescTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagSignatures::VIEWING_CONDITIONS:
                    $this->_m__raw_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    $_io__raw_tagDataElement = new \Kaitai\Struct\Stream($this->_m__raw_tagDataElement);
                    $this->_m_tagDataElement = new \Icc4\TagTable\TagDefinition\ViewingConditionsTag($_io__raw_tagDataElement, $this, $this->_root);
                    break;
                default:
                    $this->_m_tagDataElement = $this->_io->readBytes($this->sizeOfDataElement());
                    break;
            }
            $this->_io->seek($_pos);
            return $this->_m_tagDataElement;
        }
        protected $_m_tagSignature;
        protected $_m_offsetToDataElement;
        protected $_m_sizeOfDataElement;
        protected $_m__raw_tagDataElement;
        public function tagSignature() { return $this->_m_tagSignature; }
        public function offsetToDataElement() { return $this->_m_offsetToDataElement; }
        public function sizeOfDataElement() { return $this->_m_sizeOfDataElement; }
        public function _raw_tagDataElement() { return $this->_m__raw_tagDataElement; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class AToB0Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_A_TO_B_TABLE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\LutAToBType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut8Type($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut16Type($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class AToB1Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_A_TO_B_TABLE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\LutAToBType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut8Type($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut16Type($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class AToB2Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_A_TO_B_TABLE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\LutAToBType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut8Type($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut16Type($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class BToA0Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\LutBToAType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut8Type($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut16Type($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class BToA1Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\LutBToAType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut8Type($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut16Type($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class BToA2Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\LutBToAType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut8Type($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut16Type($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class BToD0Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_PROCESS_ELEMENTS_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MultiProcessElementsType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class BToD1Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_PROCESS_ELEMENTS_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MultiProcessElementsType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class BToD2Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_PROCESS_ELEMENTS_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MultiProcessElementsType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class BToD3Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_PROCESS_ELEMENTS_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MultiProcessElementsType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class BlueMatrixColumnTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::XYZ_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\XyzType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class BlueTrcTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::CURVE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\CurveType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::PARAMETRIC_CURVE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\ParametricCurveType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class CalibrationDateTimeTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::DATE_TIME_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\DateTimeType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class CharTargetTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::TEXT_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\TextType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ChromaticAdaptationTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::S_15_FIXED_16_ARRAY_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\S15Fixed16ArrayType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ChromaticityTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::CHROMATICITY_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\ChromaticityType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ChromaticityType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ChromaticityTag $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/chromaticity_type/seq/0");
            }
            $this->_m_numberOfDeviceChannels = $this->_io->readU2be();
            $this->_m_colorantAndPhosphorEncoding = $this->_io->readU2be();
            $this->_m_ciexyCoordinatesPerChannel = [];
            $n = $this->numberOfDeviceChannels();
            for ($i = 0; $i < $n; $i++) {
                $this->_m_ciexyCoordinatesPerChannel[] = new \Icc4\TagTable\TagDefinition\ChromaticityType\CiexyCoordinateValues($this->_io, $this, $this->_root);
            }
        }
        protected $_m_reserved;
        protected $_m_numberOfDeviceChannels;
        protected $_m_colorantAndPhosphorEncoding;
        protected $_m_ciexyCoordinatesPerChannel;
        public function reserved() { return $this->_m_reserved; }
        public function numberOfDeviceChannels() { return $this->_m_numberOfDeviceChannels; }
        public function colorantAndPhosphorEncoding() { return $this->_m_colorantAndPhosphorEncoding; }
        public function ciexyCoordinatesPerChannel() { return $this->_m_ciexyCoordinatesPerChannel; }
    }
}

namespace Icc4\TagTable\TagDefinition\ChromaticityType {
    class CiexyCoordinateValues extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ChromaticityType $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_xCoordinate = $this->_io->readU2be();
            $this->_m_yCoordinate = $this->_io->readU2be();
        }
        protected $_m_xCoordinate;
        protected $_m_yCoordinate;
        public function xCoordinate() { return $this->_m_xCoordinate; }
        public function yCoordinate() { return $this->_m_yCoordinate; }
    }
}

namespace Icc4\TagTable\TagDefinition\ChromaticityType {
    class ColorantAndPhosphorEncodings {
        const UNKNOWN = 0;
        const ITU_R_BT_709_2 = 1;
        const SMPTE_RP145 = 2;
        const EBU_TECH_3213_E = 3;
        const P22 = 4;

        private const _VALUES = [0 => true, 1 => true, 2 => true, 3 => true, 4 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ColorantOrderTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::COLORANT_ORDER_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\ColorantOrderType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ColorantOrderType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ColorantOrderTag $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/colorant_order_type/seq/0");
            }
            $this->_m_countOfColorants = $this->_io->readU4be();
            $this->_m_numbersOfColorantsInOrderOfPrinting = [];
            $n = $this->countOfColorants();
            for ($i = 0; $i < $n; $i++) {
                $this->_m_numbersOfColorantsInOrderOfPrinting[] = $this->_io->readU1();
            }
        }
        protected $_m_reserved;
        protected $_m_countOfColorants;
        protected $_m_numbersOfColorantsInOrderOfPrinting;
        public function reserved() { return $this->_m_reserved; }
        public function countOfColorants() { return $this->_m_countOfColorants; }
        public function numbersOfColorantsInOrderOfPrinting() { return $this->_m_numbersOfColorantsInOrderOfPrinting; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ColorantTableOutTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::COLORANT_TABLE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\ColorantTableType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ColorantTableTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::COLORANT_TABLE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\ColorantTableType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ColorantTableType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/colorant_table_type/seq/0");
            }
            $this->_m_countOfColorants = $this->_io->readU4be();
            $this->_m_colorants = [];
            $n = $this->countOfColorants();
            for ($i = 0; $i < $n; $i++) {
                $this->_m_colorants[] = new \Icc4\TagTable\TagDefinition\ColorantTableType\Colorant($this->_io, $this, $this->_root);
            }
        }
        protected $_m_reserved;
        protected $_m_countOfColorants;
        protected $_m_colorants;
        public function reserved() { return $this->_m_reserved; }
        public function countOfColorants() { return $this->_m_countOfColorants; }
        public function colorants() { return $this->_m_colorants; }
    }
}

namespace Icc4\TagTable\TagDefinition\ColorantTableType {
    class Colorant extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ColorantTableType $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_name = \Kaitai\Struct\Stream::bytesToStr($this->_io->readBytesTerm(0, false, true, true), "ASCII");
            $this->_m_padding = [];
            $n = 32 - strlen($this->name());
            for ($i = 0; $i < $n; $i++) {
                $this->_m_padding[] = $this->_io->readBytes(1);
                if (!($this->_m_padding[$i] == "\x00")) {
                    throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00", $this->_m_padding[$i], $this->_io, "/types/tag_table/types/tag_definition/types/colorant_table_type/types/colorant/seq/1");
                }
            }
            $this->_m_pcsValues = $this->_io->readBytes(6);
        }
        protected $_m_name;
        protected $_m_padding;
        protected $_m_pcsValues;
        public function name() { return $this->_m_name; }
        public function padding() { return $this->_m_padding; }
        public function pcsValues() { return $this->_m_pcsValues; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ColorimetricIntentImageStateTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::SIGNATURE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\SignatureType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class CopyrightTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_LOCALIZED_UNICODE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MultiLocalizedUnicodeType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class CurveType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/curve_type/seq/0");
            }
            $this->_m_numberOfEntries = $this->_io->readU4be();
            if ($this->numberOfEntries() > 1) {
                $this->_m_curveValues = [];
                $n = $this->numberOfEntries();
                for ($i = 0; $i < $n; $i++) {
                    $this->_m_curveValues[] = $this->_io->readU2be();
                }
            }
            if ($this->numberOfEntries() == 1) {
                $this->_m_curveValue = $this->_io->readU1();
            }
        }
        protected $_m_reserved;
        protected $_m_numberOfEntries;
        protected $_m_curveValues;
        protected $_m_curveValue;
        public function reserved() { return $this->_m_reserved; }
        public function numberOfEntries() { return $this->_m_numberOfEntries; }
        public function curveValues() { return $this->_m_curveValues; }
        public function curveValue() { return $this->_m_curveValue; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class DToB0Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_PROCESS_ELEMENTS_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MultiProcessElementsType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class DToB1Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_PROCESS_ELEMENTS_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MultiProcessElementsType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class DToB2Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_PROCESS_ELEMENTS_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MultiProcessElementsType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class DToB3Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_PROCESS_ELEMENTS_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MultiProcessElementsType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class DataType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_dataFlag = $this->_io->readU4be();
        }
        protected $_m_dataFlag;
        public function dataFlag() { return $this->_m_dataFlag; }
    }
}

namespace Icc4\TagTable\TagDefinition\DataType {
    class DataTypes {
        const ASCII_DATA = 0;
        const BINARY_DATA = 1;

        private const _VALUES = [0 => true, 1 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class DateTimeType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\CalibrationDateTimeTag $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/date_time_type/seq/0");
            }
            $this->_m_dateAndTime = new \Icc4\DateTimeNumber($this->_io, $this, $this->_root);
        }
        protected $_m_reserved;
        protected $_m_dateAndTime;
        public function reserved() { return $this->_m_reserved; }
        public function dateAndTime() { return $this->_m_dateAndTime; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class DeviceMfgDescTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_LOCALIZED_UNICODE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MultiLocalizedUnicodeType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class DeviceModelDescTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_LOCALIZED_UNICODE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MultiLocalizedUnicodeType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class GamutTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\LutBToAType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut8Type($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut16Type($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class GrayTrcTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::CURVE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\CurveType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::PARAMETRIC_CURVE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\ParametricCurveType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class GreenMatrixColumnTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::XYZ_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\XyzType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class GreenTrcTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::CURVE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\CurveType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::PARAMETRIC_CURVE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\ParametricCurveType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class LuminanceTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::XYZ_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\XyzType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class Lut16Type extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/lut_16_type/seq/0");
            }
            $this->_m_numberOfInputChannels = $this->_io->readU1();
            $this->_m_numberOfOutputChannels = $this->_io->readU1();
            $this->_m_numberOfClutGridPoints = $this->_io->readU1();
            $this->_m_padding = $this->_io->readBytes(1);
            if (!($this->_m_padding == "\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00", $this->_m_padding, $this->_io, "/types/tag_table/types/tag_definition/types/lut_16_type/seq/4");
            }
            $this->_m_encodedEParameters = [];
            $n = 9;
            for ($i = 0; $i < $n; $i++) {
                $this->_m_encodedEParameters[] = $this->_io->readS4be();
            }
            $this->_m_numberOfInputTableEntries = $this->_io->readU2be();
            $this->_m_numberOfOutputTableEntries = $this->_io->readU2be();
            $this->_m_inputTables = $this->_io->readBytes((2 * $this->numberOfInputChannels()) * $this->numberOfInputTableEntries());
            $this->_m_clutValues = $this->_io->readBytes((2 * ($this->numberOfClutGridPoints() ^ $this->numberOfInputChannels())) * $this->numberOfOutputChannels());
            $this->_m_outputTables = $this->_io->readBytes((2 * $this->numberOfOutputChannels()) * $this->numberOfOutputTableEntries());
        }
        protected $_m_reserved;
        protected $_m_numberOfInputChannels;
        protected $_m_numberOfOutputChannels;
        protected $_m_numberOfClutGridPoints;
        protected $_m_padding;
        protected $_m_encodedEParameters;
        protected $_m_numberOfInputTableEntries;
        protected $_m_numberOfOutputTableEntries;
        protected $_m_inputTables;
        protected $_m_clutValues;
        protected $_m_outputTables;
        public function reserved() { return $this->_m_reserved; }
        public function numberOfInputChannels() { return $this->_m_numberOfInputChannels; }
        public function numberOfOutputChannels() { return $this->_m_numberOfOutputChannels; }
        public function numberOfClutGridPoints() { return $this->_m_numberOfClutGridPoints; }
        public function padding() { return $this->_m_padding; }
        public function encodedEParameters() { return $this->_m_encodedEParameters; }
        public function numberOfInputTableEntries() { return $this->_m_numberOfInputTableEntries; }
        public function numberOfOutputTableEntries() { return $this->_m_numberOfOutputTableEntries; }
        public function inputTables() { return $this->_m_inputTables; }
        public function clutValues() { return $this->_m_clutValues; }
        public function outputTables() { return $this->_m_outputTables; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class Lut8Type extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/lut_8_type/seq/0");
            }
            $this->_m_numberOfInputChannels = $this->_io->readU1();
            $this->_m_numberOfOutputChannels = $this->_io->readU1();
            $this->_m_numberOfClutGridPoints = $this->_io->readU1();
            $this->_m_padding = $this->_io->readBytes(1);
            if (!($this->_m_padding == "\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00", $this->_m_padding, $this->_io, "/types/tag_table/types/tag_definition/types/lut_8_type/seq/4");
            }
            $this->_m_encodedEParameters = [];
            $n = 9;
            for ($i = 0; $i < $n; $i++) {
                $this->_m_encodedEParameters[] = $this->_io->readS4be();
            }
            $this->_m_numberOfInputTableEntries = $this->_io->readU4be();
            $this->_m_numberOfOutputTableEntries = $this->_io->readU4be();
            $this->_m_inputTables = $this->_io->readBytes(256 * $this->numberOfInputChannels());
            $this->_m_clutValues = $this->_io->readBytes(($this->numberOfClutGridPoints() ^ $this->numberOfInputChannels()) * $this->numberOfOutputChannels());
            $this->_m_outputTables = $this->_io->readBytes(256 * $this->numberOfOutputChannels());
        }
        protected $_m_reserved;
        protected $_m_numberOfInputChannels;
        protected $_m_numberOfOutputChannels;
        protected $_m_numberOfClutGridPoints;
        protected $_m_padding;
        protected $_m_encodedEParameters;
        protected $_m_numberOfInputTableEntries;
        protected $_m_numberOfOutputTableEntries;
        protected $_m_inputTables;
        protected $_m_clutValues;
        protected $_m_outputTables;
        public function reserved() { return $this->_m_reserved; }
        public function numberOfInputChannels() { return $this->_m_numberOfInputChannels; }
        public function numberOfOutputChannels() { return $this->_m_numberOfOutputChannels; }
        public function numberOfClutGridPoints() { return $this->_m_numberOfClutGridPoints; }
        public function padding() { return $this->_m_padding; }
        public function encodedEParameters() { return $this->_m_encodedEParameters; }
        public function numberOfInputTableEntries() { return $this->_m_numberOfInputTableEntries; }
        public function numberOfOutputTableEntries() { return $this->_m_numberOfOutputTableEntries; }
        public function inputTables() { return $this->_m_inputTables; }
        public function clutValues() { return $this->_m_clutValues; }
        public function outputTables() { return $this->_m_outputTables; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class LutAToBType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/lut_a_to_b_type/seq/0");
            }
            $this->_m_numberOfInputChannels = $this->_io->readU1();
            $this->_m_numberOfOutputChannels = $this->_io->readU1();
            $this->_m_padding = $this->_io->readBytes(2);
            if (!($this->_m_padding == "\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00", $this->_m_padding, $this->_io, "/types/tag_table/types/tag_definition/types/lut_a_to_b_type/seq/3");
            }
            $this->_m_offsetToFirstBCurve = $this->_io->readU4be();
            $this->_m_offsetToMatrix = $this->_io->readU4be();
            $this->_m_offsetToFirstMCurve = $this->_io->readU4be();
            $this->_m_offsetToClut = $this->_io->readU4be();
            $this->_m_offsetToFirstACurve = $this->_io->readU4be();
            $this->_m_data = $this->_io->readBytesFull();
        }
        protected $_m_reserved;
        protected $_m_numberOfInputChannels;
        protected $_m_numberOfOutputChannels;
        protected $_m_padding;
        protected $_m_offsetToFirstBCurve;
        protected $_m_offsetToMatrix;
        protected $_m_offsetToFirstMCurve;
        protected $_m_offsetToClut;
        protected $_m_offsetToFirstACurve;
        protected $_m_data;
        public function reserved() { return $this->_m_reserved; }
        public function numberOfInputChannels() { return $this->_m_numberOfInputChannels; }
        public function numberOfOutputChannels() { return $this->_m_numberOfOutputChannels; }
        public function padding() { return $this->_m_padding; }
        public function offsetToFirstBCurve() { return $this->_m_offsetToFirstBCurve; }
        public function offsetToMatrix() { return $this->_m_offsetToMatrix; }
        public function offsetToFirstMCurve() { return $this->_m_offsetToFirstMCurve; }
        public function offsetToClut() { return $this->_m_offsetToClut; }
        public function offsetToFirstACurve() { return $this->_m_offsetToFirstACurve; }
        public function data() { return $this->_m_data; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class LutBToAType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/lut_b_to_a_type/seq/0");
            }
            $this->_m_numberOfInputChannels = $this->_io->readU1();
            $this->_m_numberOfOutputChannels = $this->_io->readU1();
            $this->_m_padding = $this->_io->readBytes(2);
            if (!($this->_m_padding == "\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00", $this->_m_padding, $this->_io, "/types/tag_table/types/tag_definition/types/lut_b_to_a_type/seq/3");
            }
            $this->_m_offsetToFirstBCurve = $this->_io->readU4be();
            $this->_m_offsetToMatrix = $this->_io->readU4be();
            $this->_m_offsetToFirstMCurve = $this->_io->readU4be();
            $this->_m_offsetToClut = $this->_io->readU4be();
            $this->_m_offsetToFirstACurve = $this->_io->readU4be();
            $this->_m_data = $this->_io->readBytesFull();
        }
        protected $_m_reserved;
        protected $_m_numberOfInputChannels;
        protected $_m_numberOfOutputChannels;
        protected $_m_padding;
        protected $_m_offsetToFirstBCurve;
        protected $_m_offsetToMatrix;
        protected $_m_offsetToFirstMCurve;
        protected $_m_offsetToClut;
        protected $_m_offsetToFirstACurve;
        protected $_m_data;
        public function reserved() { return $this->_m_reserved; }
        public function numberOfInputChannels() { return $this->_m_numberOfInputChannels; }
        public function numberOfOutputChannels() { return $this->_m_numberOfOutputChannels; }
        public function padding() { return $this->_m_padding; }
        public function offsetToFirstBCurve() { return $this->_m_offsetToFirstBCurve; }
        public function offsetToMatrix() { return $this->_m_offsetToMatrix; }
        public function offsetToFirstMCurve() { return $this->_m_offsetToFirstMCurve; }
        public function offsetToClut() { return $this->_m_offsetToClut; }
        public function offsetToFirstACurve() { return $this->_m_offsetToFirstACurve; }
        public function data() { return $this->_m_data; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class MeasurementTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MEASUREMENT_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MeasurementType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class MeasurementType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\MeasurementTag $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/measurement_type/seq/0");
            }
            $this->_m_standardObserverEncoding = $this->_io->readU4be();
            $this->_m_nciexyzTristimulusValuesForMeasurementBacking = new \Icc4\XyzNumber($this->_io, $this, $this->_root);
            $this->_m_measurementGeometryEncoding = $this->_io->readU4be();
            $this->_m_measurementFlareEncoding = $this->_io->readU4be();
            $this->_m_standardIlluminantEncoding = new \Icc4\StandardIlluminantEncoding($this->_io, $this, $this->_root);
        }
        protected $_m_reserved;
        protected $_m_standardObserverEncoding;
        protected $_m_nciexyzTristimulusValuesForMeasurementBacking;
        protected $_m_measurementGeometryEncoding;
        protected $_m_measurementFlareEncoding;
        protected $_m_standardIlluminantEncoding;
        public function reserved() { return $this->_m_reserved; }
        public function standardObserverEncoding() { return $this->_m_standardObserverEncoding; }
        public function nciexyzTristimulusValuesForMeasurementBacking() { return $this->_m_nciexyzTristimulusValuesForMeasurementBacking; }
        public function measurementGeometryEncoding() { return $this->_m_measurementGeometryEncoding; }
        public function measurementFlareEncoding() { return $this->_m_measurementFlareEncoding; }
        public function standardIlluminantEncoding() { return $this->_m_standardIlluminantEncoding; }
    }
}

namespace Icc4\TagTable\TagDefinition\MeasurementType {
    class MeasurementFlareEncodings {
        const ZERO_PERCENT = 0;
        const ONE_HUNDRED_PERCENT = 65536;

        private const _VALUES = [0 => true, 65536 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\TagTable\TagDefinition\MeasurementType {
    class MeasurementGeometryEncodings {
        const UNKNOWN = 0;
        const ZERO_DEGREES_TO_45_DEGREES_OR_45_DEGREES_TO_ZERO_DEGREES = 1;
        const ZERO_DEGREES_TO_D_DEGREES_OR_D_DEGREES_TO_ZERO_DEGREES = 2;

        private const _VALUES = [0 => true, 1 => true, 2 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\TagTable\TagDefinition\MeasurementType {
    class StandardObserverEncodings {
        const UNKNOWN = 0;
        const CIE_1931_STANDARD_COLORIMETRIC_OBSERVER = 1;
        const CIE_1964_STANDARD_COLORIMETRIC_OBSERVER = 2;

        private const _VALUES = [0 => true, 1 => true, 2 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class MediaWhitePointTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::XYZ_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\XyzType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class MultiLocalizedUnicodeType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/multi_localized_unicode_type/seq/0");
            }
            $this->_m_numberOfRecords = $this->_io->readU4be();
            $this->_m_recordSize = $this->_io->readU4be();
            $this->_m_records = [];
            $n = $this->numberOfRecords();
            for ($i = 0; $i < $n; $i++) {
                $this->_m_records[] = new \Icc4\TagTable\TagDefinition\MultiLocalizedUnicodeType\Record($this->_io, $this, $this->_root);
            }
        }
        protected $_m_reserved;
        protected $_m_numberOfRecords;
        protected $_m_recordSize;
        protected $_m_records;
        public function reserved() { return $this->_m_reserved; }
        public function numberOfRecords() { return $this->_m_numberOfRecords; }
        public function recordSize() { return $this->_m_recordSize; }
        public function records() { return $this->_m_records; }
    }
}

namespace Icc4\TagTable\TagDefinition\MultiLocalizedUnicodeType {
    class Record extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\MultiLocalizedUnicodeType $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_languageCode = $this->_io->readU2be();
            $this->_m_countryCode = $this->_io->readU2be();
            $this->_m_stringLength = $this->_io->readU4be();
            $this->_m_stringOffset = $this->_io->readU4be();
        }
        protected $_m_stringData;
        public function stringData() {
            if ($this->_m_stringData !== null)
                return $this->_m_stringData;
            $_pos = $this->_io->pos();
            $this->_io->seek($this->stringOffset());
            $this->_m_stringData = \Kaitai\Struct\Stream::bytesToStr($this->_io->readBytes($this->stringLength()), "UTF-16BE");
            $this->_io->seek($_pos);
            return $this->_m_stringData;
        }
        protected $_m_languageCode;
        protected $_m_countryCode;
        protected $_m_stringLength;
        protected $_m_stringOffset;
        public function languageCode() { return $this->_m_languageCode; }
        public function countryCode() { return $this->_m_countryCode; }
        public function stringLength() { return $this->_m_stringLength; }
        public function stringOffset() { return $this->_m_stringOffset; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class MultiProcessElementsType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/multi_process_elements_type/seq/0");
            }
            $this->_m_numberOfInputChannels = $this->_io->readU2be();
            $this->_m_numberOfOutputChannels = $this->_io->readU2be();
            $this->_m_numberOfProcessingElements = $this->_io->readU4be();
            $this->_m_processElementPositionsTable = [];
            $n = $this->numberOfProcessingElements();
            for ($i = 0; $i < $n; $i++) {
                $this->_m_processElementPositionsTable[] = new \Icc4\PositionNumber($this->_io, $this, $this->_root);
            }
            $this->_m_data = $this->_io->readBytesFull();
        }
        protected $_m_reserved;
        protected $_m_numberOfInputChannels;
        protected $_m_numberOfOutputChannels;
        protected $_m_numberOfProcessingElements;
        protected $_m_processElementPositionsTable;
        protected $_m_data;
        public function reserved() { return $this->_m_reserved; }
        public function numberOfInputChannels() { return $this->_m_numberOfInputChannels; }
        public function numberOfOutputChannels() { return $this->_m_numberOfOutputChannels; }
        public function numberOfProcessingElements() { return $this->_m_numberOfProcessingElements; }
        public function processElementPositionsTable() { return $this->_m_processElementPositionsTable; }
        public function data() { return $this->_m_data; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class NamedColor2Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::NAMED_COLOR_2_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\NamedColor2Type($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class NamedColor2Type extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\NamedColor2Tag $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/named_color_2_type/seq/0");
            }
            $this->_m_vendorSpecificFlag = $this->_io->readU4be();
            $this->_m_countOfNamedColours = $this->_io->readU4be();
            $this->_m_numberOfDeviceCoordinatesForEachNamedColour = $this->_io->readU4be();
            $this->_m_prefixForEachColourName = \Kaitai\Struct\Stream::bytesToStr($this->_io->readBytesTerm(0, false, true, true), "ASCII");
            $this->_m_prefixForEachColourNamePadding = [];
            $n = 32 - strlen($this->prefixForEachColourName());
            for ($i = 0; $i < $n; $i++) {
                $this->_m_prefixForEachColourNamePadding[] = $this->_io->readBytes(1);
                if (!($this->_m_prefixForEachColourNamePadding[$i] == "\x00")) {
                    throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00", $this->_m_prefixForEachColourNamePadding[$i], $this->_io, "/types/tag_table/types/tag_definition/types/named_color_2_type/seq/5");
                }
            }
            $this->_m_suffixForEachColourName = \Kaitai\Struct\Stream::bytesToStr($this->_io->readBytesTerm(0, false, true, true), "ASCII");
            $this->_m_suffixForEachColourNamePadding = [];
            $n = 32 - strlen($this->suffixForEachColourName());
            for ($i = 0; $i < $n; $i++) {
                $this->_m_suffixForEachColourNamePadding[] = $this->_io->readBytes(1);
                if (!($this->_m_suffixForEachColourNamePadding[$i] == "\x00")) {
                    throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00", $this->_m_suffixForEachColourNamePadding[$i], $this->_io, "/types/tag_table/types/tag_definition/types/named_color_2_type/seq/7");
                }
            }
            $this->_m_namedColourDefinitions = [];
            $n = $this->countOfNamedColours();
            for ($i = 0; $i < $n; $i++) {
                $this->_m_namedColourDefinitions[] = new \Icc4\TagTable\TagDefinition\NamedColor2Type\NamedColourDefinition($this->_io, $this, $this->_root);
            }
        }
        protected $_m_reserved;
        protected $_m_vendorSpecificFlag;
        protected $_m_countOfNamedColours;
        protected $_m_numberOfDeviceCoordinatesForEachNamedColour;
        protected $_m_prefixForEachColourName;
        protected $_m_prefixForEachColourNamePadding;
        protected $_m_suffixForEachColourName;
        protected $_m_suffixForEachColourNamePadding;
        protected $_m_namedColourDefinitions;
        public function reserved() { return $this->_m_reserved; }
        public function vendorSpecificFlag() { return $this->_m_vendorSpecificFlag; }
        public function countOfNamedColours() { return $this->_m_countOfNamedColours; }
        public function numberOfDeviceCoordinatesForEachNamedColour() { return $this->_m_numberOfDeviceCoordinatesForEachNamedColour; }
        public function prefixForEachColourName() { return $this->_m_prefixForEachColourName; }
        public function prefixForEachColourNamePadding() { return $this->_m_prefixForEachColourNamePadding; }
        public function suffixForEachColourName() { return $this->_m_suffixForEachColourName; }
        public function suffixForEachColourNamePadding() { return $this->_m_suffixForEachColourNamePadding; }
        public function namedColourDefinitions() { return $this->_m_namedColourDefinitions; }
    }
}

namespace Icc4\TagTable\TagDefinition\NamedColor2Type {
    class NamedColourDefinition extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\NamedColor2Type $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_rootName = \Kaitai\Struct\Stream::bytesToStr($this->_io->readBytesTerm(0, false, true, true), "ASCII");
            $this->_m_rootNamePadding = [];
            $n = 32 - strlen($this->rootName());
            for ($i = 0; $i < $n; $i++) {
                $this->_m_rootNamePadding[] = $this->_io->readBytes(1);
                if (!($this->_m_rootNamePadding[$i] == "\x00")) {
                    throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00", $this->_m_rootNamePadding[$i], $this->_io, "/types/tag_table/types/tag_definition/types/named_color_2_type/types/named_colour_definition/seq/1");
                }
            }
            $this->_m_pcsCoordinates = $this->_io->readBytes(6);
            if ($this->_parent()->numberOfDeviceCoordinatesForEachNamedColour() > 0) {
                $this->_m_deviceCoordinates = [];
                $n = $this->_parent()->numberOfDeviceCoordinatesForEachNamedColour();
                for ($i = 0; $i < $n; $i++) {
                    $this->_m_deviceCoordinates[] = $this->_io->readU2be();
                }
            }
        }
        protected $_m_rootName;
        protected $_m_rootNamePadding;
        protected $_m_pcsCoordinates;
        protected $_m_deviceCoordinates;
        public function rootName() { return $this->_m_rootName; }
        public function rootNamePadding() { return $this->_m_rootNamePadding; }
        public function pcsCoordinates() { return $this->_m_pcsCoordinates; }
        public function deviceCoordinates() { return $this->_m_deviceCoordinates; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class OutputResponseTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::RESPONSE_CURVE_SET_16_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\ResponseCurveSet16Type($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ParametricCurveType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/parametric_curve_type/seq/0");
            }
            $this->_m_functionType = $this->_io->readU2be();
            $this->_m_reserved2 = $this->_io->readBytes(2);
            if (!($this->_m_reserved2 == "\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00", $this->_m_reserved2, $this->_io, "/types/tag_table/types/tag_definition/types/parametric_curve_type/seq/2");
            }
            switch ($this->functionType()) {
                case \Icc4\TagTable\TagDefinition\ParametricCurveType\ParametricCurveTypeFunctions::CIE_122_1996:
                    $this->_m_parameters = new \Icc4\TagTable\TagDefinition\ParametricCurveType\ParamsCie1221996($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\ParametricCurveType\ParametricCurveTypeFunctions::IEC_61966_2_1:
                    $this->_m_parameters = new \Icc4\TagTable\TagDefinition\ParametricCurveType\ParamsIec6196621($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\ParametricCurveType\ParametricCurveTypeFunctions::IEC_61966_3:
                    $this->_m_parameters = new \Icc4\TagTable\TagDefinition\ParametricCurveType\ParamsIec619663($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\ParametricCurveType\ParametricCurveTypeFunctions::Y_EQUALS_OB_AX_PLUS_B_CB_TO_POWER_OF_G_PLUS_C:
                    $this->_m_parameters = new \Icc4\TagTable\TagDefinition\ParametricCurveType\ParamsYEqualsObAxPlusBCbToPowerOfGPlusC($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\ParametricCurveType\ParametricCurveTypeFunctions::Y_EQUALS_X_TO_POWER_OF_G:
                    $this->_m_parameters = new \Icc4\TagTable\TagDefinition\ParametricCurveType\ParamsYEqualsXToPowerOfG($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_reserved;
        protected $_m_functionType;
        protected $_m_reserved2;
        protected $_m_parameters;
        public function reserved() { return $this->_m_reserved; }
        public function functionType() { return $this->_m_functionType; }
        public function reserved2() { return $this->_m_reserved2; }
        public function parameters() { return $this->_m_parameters; }
    }
}

namespace Icc4\TagTable\TagDefinition\ParametricCurveType {
    class ParamsCie1221996 extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ParametricCurveType $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_g = $this->_io->readS4be();
            $this->_m_a = $this->_io->readS4be();
            $this->_m_b = $this->_io->readS4be();
        }
        protected $_m_g;
        protected $_m_a;
        protected $_m_b;
        public function g() { return $this->_m_g; }
        public function a() { return $this->_m_a; }
        public function b() { return $this->_m_b; }
    }
}

namespace Icc4\TagTable\TagDefinition\ParametricCurveType {
    class ParamsIec6196621 extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ParametricCurveType $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_g = $this->_io->readS4be();
            $this->_m_a = $this->_io->readS4be();
            $this->_m_b = $this->_io->readS4be();
            $this->_m_c = $this->_io->readS4be();
            $this->_m_d = $this->_io->readS4be();
        }
        protected $_m_g;
        protected $_m_a;
        protected $_m_b;
        protected $_m_c;
        protected $_m_d;
        public function g() { return $this->_m_g; }
        public function a() { return $this->_m_a; }
        public function b() { return $this->_m_b; }
        public function c() { return $this->_m_c; }
        public function d() { return $this->_m_d; }
    }
}

namespace Icc4\TagTable\TagDefinition\ParametricCurveType {
    class ParamsIec619663 extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ParametricCurveType $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_g = $this->_io->readS4be();
            $this->_m_a = $this->_io->readS4be();
            $this->_m_b = $this->_io->readS4be();
            $this->_m_c = $this->_io->readS4be();
        }
        protected $_m_g;
        protected $_m_a;
        protected $_m_b;
        protected $_m_c;
        public function g() { return $this->_m_g; }
        public function a() { return $this->_m_a; }
        public function b() { return $this->_m_b; }
        public function c() { return $this->_m_c; }
    }
}

namespace Icc4\TagTable\TagDefinition\ParametricCurveType {
    class ParamsYEqualsObAxPlusBCbToPowerOfGPlusC extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ParametricCurveType $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_g = $this->_io->readS4be();
            $this->_m_a = $this->_io->readS4be();
            $this->_m_b = $this->_io->readS4be();
            $this->_m_c = $this->_io->readS4be();
            $this->_m_d = $this->_io->readS4be();
            $this->_m_e = $this->_io->readS4be();
            $this->_m_f = $this->_io->readS4be();
        }
        protected $_m_g;
        protected $_m_a;
        protected $_m_b;
        protected $_m_c;
        protected $_m_d;
        protected $_m_e;
        protected $_m_f;
        public function g() { return $this->_m_g; }
        public function a() { return $this->_m_a; }
        public function b() { return $this->_m_b; }
        public function c() { return $this->_m_c; }
        public function d() { return $this->_m_d; }
        public function e() { return $this->_m_e; }
        public function f() { return $this->_m_f; }
    }
}

namespace Icc4\TagTable\TagDefinition\ParametricCurveType {
    class ParamsYEqualsXToPowerOfG extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ParametricCurveType $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_g = $this->_io->readS4be();
        }
        protected $_m_g;
        public function g() { return $this->_m_g; }
    }
}

namespace Icc4\TagTable\TagDefinition\ParametricCurveType {
    class ParametricCurveTypeFunctions {
        const Y_EQUALS_X_TO_POWER_OF_G = 0;
        const CIE_122_1996 = 1;
        const IEC_61966_3 = 2;
        const IEC_61966_2_1 = 3;
        const Y_EQUALS_OB_AX_PLUS_B_CB_TO_POWER_OF_G_PLUS_C = 4;

        private const _VALUES = [0 => true, 1 => true, 2 => true, 3 => true, 4 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class PerceptualRenderingIntentGamutTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::SIGNATURE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\SignatureType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class Preview0Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_A_TO_B_TABLE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\LutAToBType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\LutBToAType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut8Type($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut16Type($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class Preview1Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\LutBToAType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut8Type($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut16Type($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class Preview2Tag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_B_TO_A_TABLE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\LutBToAType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut8Type($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\Lut16Type($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ProfileDescriptionTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_LOCALIZED_UNICODE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MultiLocalizedUnicodeType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ProfileSequenceDescType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ProfileSequenceTag $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/profile_sequence_desc_type/seq/0");
            }
            $this->_m_numberOfDescriptionStructures = $this->_io->readU4be();
            $this->_m_profileDescriptions = [];
            $n = $this->numberOfDescriptionStructures();
            for ($i = 0; $i < $n; $i++) {
                $this->_m_profileDescriptions[] = new \Icc4\TagTable\TagDefinition\ProfileSequenceDescType\ProfileDescription($this->_io, $this, $this->_root);
            }
        }
        protected $_m_reserved;
        protected $_m_numberOfDescriptionStructures;
        protected $_m_profileDescriptions;
        public function reserved() { return $this->_m_reserved; }
        public function numberOfDescriptionStructures() { return $this->_m_numberOfDescriptionStructures; }
        public function profileDescriptions() { return $this->_m_profileDescriptions; }
    }
}

namespace Icc4\TagTable\TagDefinition\ProfileSequenceDescType {
    class ProfileDescription extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ProfileSequenceDescType $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_deviceManufacturer = new \Icc4\DeviceManufacturer($this->_io, $this, $this->_root);
            $this->_m_deviceModel = \Kaitai\Struct\Stream::bytesToStr($this->_io->readBytes(4), "ASCII");
            $this->_m_deviceAttributes = new \Icc4\DeviceAttributes($this->_io, $this, $this->_root);
            $this->_m_deviceTechnology = new \Icc4\TagTable\TagDefinition\TechnologyTag($this->_io, $this, $this->_root);
            $this->_m_descriptionOfDeviceManufacturer = new \Icc4\TagTable\TagDefinition\DeviceMfgDescTag($this->_io, $this, $this->_root);
            $this->_m_descriptionOfDeviceModel = new \Icc4\TagTable\TagDefinition\DeviceModelDescTag($this->_io, $this, $this->_root);
        }
        protected $_m_deviceManufacturer;
        protected $_m_deviceModel;
        protected $_m_deviceAttributes;
        protected $_m_deviceTechnology;
        protected $_m_descriptionOfDeviceManufacturer;
        protected $_m_descriptionOfDeviceModel;
        public function deviceManufacturer() { return $this->_m_deviceManufacturer; }
        public function deviceModel() { return $this->_m_deviceModel; }
        public function deviceAttributes() { return $this->_m_deviceAttributes; }
        public function deviceTechnology() { return $this->_m_deviceTechnology; }
        public function descriptionOfDeviceManufacturer() { return $this->_m_descriptionOfDeviceManufacturer; }
        public function descriptionOfDeviceModel() { return $this->_m_descriptionOfDeviceModel; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ProfileSequenceIdentifierTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::PROFILE_SEQUENCE_IDENTIFIER_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\ProfileSequenceIdentifierType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ProfileSequenceIdentifierType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ProfileSequenceIdentifierTag $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/profile_sequence_identifier_type/seq/0");
            }
            $this->_m_numberOfStructures = $this->_io->readU4be();
            $this->_m_positionsTable = [];
            $n = $this->numberOfStructures();
            for ($i = 0; $i < $n; $i++) {
                $this->_m_positionsTable[] = new \Icc4\PositionNumber($this->_io, $this, $this->_root);
            }
            $this->_m_profileIdentifiers = [];
            $n = $this->numberOfStructures();
            for ($i = 0; $i < $n; $i++) {
                $this->_m_profileIdentifiers[] = new \Icc4\TagTable\TagDefinition\ProfileSequenceIdentifierType\ProfileIdentifier($this->_io, $this, $this->_root);
            }
        }
        protected $_m_reserved;
        protected $_m_numberOfStructures;
        protected $_m_positionsTable;
        protected $_m_profileIdentifiers;
        public function reserved() { return $this->_m_reserved; }
        public function numberOfStructures() { return $this->_m_numberOfStructures; }
        public function positionsTable() { return $this->_m_positionsTable; }
        public function profileIdentifiers() { return $this->_m_profileIdentifiers; }
    }
}

namespace Icc4\TagTable\TagDefinition\ProfileSequenceIdentifierType {
    class ProfileIdentifier extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ProfileSequenceIdentifierType $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_profileId = $this->_io->readBytes(16);
            $this->_m_profileDescription = new \Icc4\TagTable\TagDefinition\MultiLocalizedUnicodeType($this->_io, $this, $this->_root);
        }
        protected $_m_profileId;
        protected $_m_profileDescription;
        public function profileId() { return $this->_m_profileId; }
        public function profileDescription() { return $this->_m_profileDescription; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ProfileSequenceTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::PROFILE_SEQUENCE_DESC_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\ProfileSequenceDescType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class RedMatrixColumnTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::XYZ_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\XyzType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class RedTrcTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::CURVE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\CurveType($this->_io, $this, $this->_root);
                    break;
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::PARAMETRIC_CURVE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\ParametricCurveType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ResponseCurveSet16Type extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\OutputResponseTag $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/response_curve_set_16_type/seq/0");
            }
            $this->_m_numberOfChannels = $this->_io->readU2be();
            $this->_m_countOfMeasurementTypes = $this->_io->readU2be();
            $this->_m_responseCurveStructureOffsets = [];
            $n = $this->countOfMeasurementTypes();
            for ($i = 0; $i < $n; $i++) {
                $this->_m_responseCurveStructureOffsets[] = $this->_io->readU4be();
            }
            $this->_m_responseCurveStructures = $this->_io->readBytesFull();
        }
        protected $_m_reserved;
        protected $_m_numberOfChannels;
        protected $_m_countOfMeasurementTypes;
        protected $_m_responseCurveStructureOffsets;
        protected $_m_responseCurveStructures;
        public function reserved() { return $this->_m_reserved; }
        public function numberOfChannels() { return $this->_m_numberOfChannels; }
        public function countOfMeasurementTypes() { return $this->_m_countOfMeasurementTypes; }
        public function responseCurveStructureOffsets() { return $this->_m_responseCurveStructureOffsets; }
        public function responseCurveStructures() { return $this->_m_responseCurveStructures; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class S15Fixed16ArrayType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ChromaticAdaptationTag $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/s_15_fixed_16_array_type/seq/0");
            }
            $this->_m_values = [];
            $i = 0;
            while (!$this->_io->isEof()) {
                $this->_m_values[] = new \Icc4\S15Fixed16Number($this->_io, $this, $this->_root);
                $i++;
            }
        }
        protected $_m_reserved;
        protected $_m_values;
        public function reserved() { return $this->_m_reserved; }
        public function values() { return $this->_m_values; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class SaturationRenderingIntentGamutTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::SIGNATURE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\SignatureType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class SignatureType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/signature_type/seq/0");
            }
            $this->_m_signature = \Kaitai\Struct\Stream::bytesToStr($this->_io->readBytes(4), "ASCII");
        }
        protected $_m_reserved;
        protected $_m_signature;
        public function reserved() { return $this->_m_reserved; }
        public function signature() { return $this->_m_signature; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class TechnologyTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::SIGNATURE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\SignatureType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class TextType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\CharTargetTag $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/text_type/seq/0");
            }
            $this->_m_value = \Kaitai\Struct\Stream::bytesToStr(\Kaitai\Struct\Stream::bytesTerminate($this->_io->readBytesFull(), 0, false), "ASCII");
        }
        protected $_m_reserved;
        protected $_m_value;
        public function reserved() { return $this->_m_reserved; }
        public function value() { return $this->_m_value; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class U16Fixed16ArrayType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/u_16_fixed_16_array_type/seq/0");
            }
            $this->_m_values = [];
            $i = 0;
            while (!$this->_io->isEof()) {
                $this->_m_values[] = new \Icc4\U16Fixed16Number($this->_io, $this, $this->_root);
                $i++;
            }
        }
        protected $_m_reserved;
        protected $_m_values;
        public function reserved() { return $this->_m_reserved; }
        public function values() { return $this->_m_values; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class UInt16ArrayType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/u_int_16_array_type/seq/0");
            }
            $this->_m_values = [];
            $i = 0;
            while (!$this->_io->isEof()) {
                $this->_m_values[] = $this->_io->readU2be();
                $i++;
            }
        }
        protected $_m_reserved;
        protected $_m_values;
        public function reserved() { return $this->_m_reserved; }
        public function values() { return $this->_m_values; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class UInt32ArrayType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/u_int_32_array_type/seq/0");
            }
            $this->_m_values = [];
            $i = 0;
            while (!$this->_io->isEof()) {
                $this->_m_values[] = $this->_io->readU4be();
                $i++;
            }
        }
        protected $_m_reserved;
        protected $_m_values;
        public function reserved() { return $this->_m_reserved; }
        public function values() { return $this->_m_values; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class UInt64ArrayType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/u_int_64_array_type/seq/0");
            }
            $this->_m_values = [];
            $i = 0;
            while (!$this->_io->isEof()) {
                $this->_m_values[] = $this->_io->readU8be();
                $i++;
            }
        }
        protected $_m_reserved;
        protected $_m_values;
        public function reserved() { return $this->_m_reserved; }
        public function values() { return $this->_m_values; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class UInt8ArrayType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/u_int_8_array_type/seq/0");
            }
            $this->_m_values = [];
            $i = 0;
            while (!$this->_io->isEof()) {
                $this->_m_values[] = $this->_io->readU1();
                $i++;
            }
        }
        protected $_m_reserved;
        protected $_m_values;
        public function reserved() { return $this->_m_reserved; }
        public function values() { return $this->_m_values; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ViewingCondDescTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::MULTI_LOCALIZED_UNICODE_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\MultiLocalizedUnicodeType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ViewingConditionsTag extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_tagType = $this->_io->readU4be();
            switch ($this->tagType()) {
                case \Icc4\TagTable\TagDefinition\TagTypeSignatures::VIEWING_CONDITIONS_TYPE:
                    $this->_m_tagData = new \Icc4\TagTable\TagDefinition\ViewingConditionsType($this->_io, $this, $this->_root);
                    break;
            }
        }
        protected $_m_tagType;
        protected $_m_tagData;
        public function tagType() { return $this->_m_tagType; }
        public function tagData() { return $this->_m_tagData; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class ViewingConditionsType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\ViewingConditionsTag $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/viewing_conditions_type/seq/0");
            }
            $this->_m_unNormalizedCiexyzValuesForIlluminant = new \Icc4\XyzNumber($this->_io, $this, $this->_root);
            $this->_m_unNormalizedCiexyzValuesForSurround = new \Icc4\XyzNumber($this->_io, $this, $this->_root);
            $this->_m_illuminantType = new \Icc4\StandardIlluminantEncoding($this->_io, $this, $this->_root);
        }
        protected $_m_reserved;
        protected $_m_unNormalizedCiexyzValuesForIlluminant;
        protected $_m_unNormalizedCiexyzValuesForSurround;
        protected $_m_illuminantType;
        public function reserved() { return $this->_m_reserved; }
        public function unNormalizedCiexyzValuesForIlluminant() { return $this->_m_unNormalizedCiexyzValuesForIlluminant; }
        public function unNormalizedCiexyzValuesForSurround() { return $this->_m_unNormalizedCiexyzValuesForSurround; }
        public function illuminantType() { return $this->_m_illuminantType; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class XyzType extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_reserved = $this->_io->readBytes(4);
            if (!($this->_m_reserved == "\x00\x00\x00\x00")) {
                throw new \Kaitai\Struct\Error\ValidationNotEqualError("\x00\x00\x00\x00", $this->_m_reserved, $this->_io, "/types/tag_table/types/tag_definition/types/xyz_type/seq/0");
            }
            $this->_m_values = [];
            $i = 0;
            while (!$this->_io->isEof()) {
                $this->_m_values[] = new \Icc4\XyzNumber($this->_io, $this, $this->_root);
                $i++;
            }
        }
        protected $_m_reserved;
        protected $_m_values;
        public function reserved() { return $this->_m_reserved; }
        public function values() { return $this->_m_values; }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class MultiProcessElementsTypes {
        const BACS_ELEMENT_TYPE = 1648444243;
        const CLUT_ELEMENT_TYPE = 1668052340;
        const ONE_DIMENSIONAL_CURVES_TYPE = 1668641382;
        const EACS_ELEMENT_TYPE = 1698775891;
        const MATRIX_ELEMENT_TYPE = 1835103334;
        const CURVE_SET_ELEMENT_TABLE_TYPE = 1835428980;
        const FORMULA_CURVE_SEGMENTS_TYPE = 1885434470;
        const SAMPLED_CURVE_SEGMENT_TYPE = 1935764838;

        private const _VALUES = [1648444243 => true, 1668052340 => true, 1668641382 => true, 1698775891 => true, 1835103334 => true, 1835428980 => true, 1885434470 => true, 1935764838 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class TagSignatures {
        const A_TO_B_0 = 1093812784;
        const A_TO_B_1 = 1093812785;
        const A_TO_B_2 = 1093812786;
        const B_TO_A_0 = 1110589744;
        const B_TO_A_1 = 1110589745;
        const B_TO_A_2 = 1110589746;
        const B_TO_D_0 = 1110590512;
        const B_TO_D_1 = 1110590513;
        const B_TO_D_2 = 1110590514;
        const B_TO_D_3 = 1110590515;
        const D_TO_B_0 = 1144144432;
        const D_TO_B_1 = 1144144433;
        const D_TO_B_2 = 1144144434;
        const D_TO_B_3 = 1144144435;
        const BLUE_TRC = 1649693251;
        const BLUE_MATRIX_COLUMN = 1649957210;
        const CALIBRATION_DATE_TIME = 1667329140;
        const CHROMATIC_ADAPTATION = 1667785060;
        const CHROMATICITY = 1667789421;
        const COLORIMETRIC_INTENT_IMAGE_STATE = 1667852659;
        const COLORANT_TABLE_OUT = 1668050804;
        const COLORANT_ORDER = 1668051567;
        const COLORANT_TABLE = 1668051572;
        const COPYRIGHT = 1668313716;
        const PROFILE_DESCRIPTION = 1684370275;
        const DEVICE_MODEL_DESC = 1684890724;
        const DEVICE_MFG_DESC = 1684893284;
        const GREEN_TRC = 1733579331;
        const GREEN_MATRIX_COLUMN = 1733843290;
        const GAMUT = 1734438260;
        const GRAY_TRC = 1800688195;
        const LUMINANCE = 1819635049;
        const MEASUREMENT = 1835360627;
        const NAMED_COLOR_2 = 1852009522;
        const PREVIEW_0 = 1886545200;
        const PREVIEW_1 = 1886545201;
        const PREVIEW_2 = 1886545202;
        const PROFILE_SEQUENCE = 1886610801;
        const PROFILE_SEQUENCE_IDENTIFIER = 1886611812;
        const RED_TRC = 1918128707;
        const RED_MATRIX_COLUMN = 1918392666;
        const OUTPUT_RESPONSE = 1919251312;
        const PERCEPTUAL_RENDERING_INTENT_GAMUT = 1919510320;
        const SATURATION_RENDERING_INTENT_GAMUT = 1919510322;
        const CHAR_TARGET = 1952543335;
        const TECHNOLOGY = 1952801640;
        const VIEWING_CONDITIONS = 1986618743;
        const VIEWING_COND_DESC = 1987405156;
        const MEDIA_WHITE_POINT = 2004119668;

        private const _VALUES = [1093812784 => true, 1093812785 => true, 1093812786 => true, 1110589744 => true, 1110589745 => true, 1110589746 => true, 1110590512 => true, 1110590513 => true, 1110590514 => true, 1110590515 => true, 1144144432 => true, 1144144433 => true, 1144144434 => true, 1144144435 => true, 1649693251 => true, 1649957210 => true, 1667329140 => true, 1667785060 => true, 1667789421 => true, 1667852659 => true, 1668050804 => true, 1668051567 => true, 1668051572 => true, 1668313716 => true, 1684370275 => true, 1684890724 => true, 1684893284 => true, 1733579331 => true, 1733843290 => true, 1734438260 => true, 1800688195 => true, 1819635049 => true, 1835360627 => true, 1852009522 => true, 1886545200 => true, 1886545201 => true, 1886545202 => true, 1886610801 => true, 1886611812 => true, 1918128707 => true, 1918392666 => true, 1919251312 => true, 1919510320 => true, 1919510322 => true, 1952543335 => true, 1952801640 => true, 1986618743 => true, 1987405156 => true, 2004119668 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4\TagTable\TagDefinition {
    class TagTypeSignatures {
        const XYZ_TYPE = 1482250784;
        const CHROMATICITY_TYPE = 1667789421;
        const COLORANT_ORDER_TYPE = 1668051567;
        const COLORANT_TABLE_TYPE = 1668051572;
        const CURVE_TYPE = 1668641398;
        const DATA_TYPE = 1684108385;
        const DATE_TIME_TYPE = 1685350765;
        const MULTI_FUNCTION_A_TO_B_TABLE_TYPE = 1832993312;
        const MULTI_FUNCTION_B_TO_A_TABLE_TYPE = 1833058592;
        const MEASUREMENT_TYPE = 1835360627;
        const MULTI_FUNCTION_TABLE_WITH_ONE_BYTE_PRECISION_TYPE = 1835430961;
        const MULTI_FUNCTION_TABLE_WITH_TWO_BYTE_PRECISION_TYPE = 1835430962;
        const MULTI_LOCALIZED_UNICODE_TYPE = 1835824483;
        const MULTI_PROCESS_ELEMENTS_TYPE = 1836082548;
        const NAMED_COLOR_2_TYPE = 1852009522;
        const PARAMETRIC_CURVE_TYPE = 1885434465;
        const PROFILE_SEQUENCE_DESC_TYPE = 1886610801;
        const PROFILE_SEQUENCE_IDENTIFIER_TYPE = 1886611812;
        const RESPONSE_CURVE_SET_16_TYPE = 1919120178;
        const S_15_FIXED_16_ARRAY_TYPE = 1936077618;
        const SIGNATURE_TYPE = 1936287520;
        const TEXT_TYPE = 1952807028;
        const U_16_FIXED_16_ARRAY_TYPE = 1969632050;
        const U_INT_8_ARRAY_TYPE = 1969827896;
        const U_INT_16_ARRAY_TYPE = 1969828150;
        const U_INT_32_ARRAY_TYPE = 1969828658;
        const U_INT_64_ARRAY_TYPE = 1969829428;
        const VIEWING_CONDITIONS_TYPE = 1986618743;

        private const _VALUES = [1482250784 => true, 1667789421 => true, 1668051567 => true, 1668051572 => true, 1668641398 => true, 1684108385 => true, 1685350765 => true, 1832993312 => true, 1833058592 => true, 1835360627 => true, 1835430961 => true, 1835430962 => true, 1835824483 => true, 1836082548 => true, 1852009522 => true, 1885434465 => true, 1886610801 => true, 1886611812 => true, 1919120178 => true, 1936077618 => true, 1936287520 => true, 1952807028 => true, 1969632050 => true, 1969827896 => true, 1969828150 => true, 1969828658 => true, 1969829428 => true, 1986618743 => true];

        public static function isDefined(int $v): bool {
            return isset(self::_VALUES[$v]);
        }
    }
}

namespace Icc4 {
    class U16Fixed16Number extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Icc4\TagTable\TagDefinition\U16Fixed16ArrayType $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_number = $this->_io->readBytes(4);
        }
        protected $_m_number;
        public function number() { return $this->_m_number; }
    }
}

namespace Icc4 {
    class U1Fixed15Number extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_number = $this->_io->readBytes(2);
        }
        protected $_m_number;
        public function number() { return $this->_m_number; }
    }
}

namespace Icc4 {
    class U8Fixed8Number extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_number = $this->_io->readBytes(2);
        }
        protected $_m_number;
        public function number() { return $this->_m_number; }
    }
}

namespace Icc4 {
    class XyzNumber extends \Kaitai\Struct\Struct {
        public function __construct(\Kaitai\Struct\Stream $_io, ?\Kaitai\Struct\Struct $_parent = null, ?\Icc4 $_root = null) {
            parent::__construct($_io, $_parent, $_root);
            $this->_read();
        }

        private function _read() {
            $this->_m_x = $this->_io->readBytes(4);
            $this->_m_y = $this->_io->readBytes(4);
            $this->_m_z = $this->_io->readBytes(4);
        }
        protected $_m_x;
        protected $_m_y;
        protected $_m_z;
        public function x() { return $this->_m_x; }
        public function y() { return $this->_m_y; }
        public function z() { return $this->_m_z; }
    }
}