// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.pqc.crypto.util;

import org.bouncycastle.pqc.crypto.xmss.BDSStateMap;
import org.bouncycastle.pqc.asn1.XMSSMTPrivateKey;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.pqc.crypto.xmss.BDS;
import org.bouncycastle.pqc.crypto.xmss.XMSSUtil;
import org.bouncycastle.pqc.asn1.XMSSPrivateKey;
import org.bouncycastle.pqc.crypto.snova.SnovaPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.mayo.MayoPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.rainbow.RainbowPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.hqc.HQCPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.bike.BIKEPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.crystals.dilithium.DilithiumPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.mldsa.MLDSAPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.ntruprime.SNTRUPrimePrivateKeyParameters;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.pqc.crypto.ntruprime.NTRULPRimePrivateKeyParameters;
import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.pqc.crypto.mlkem.MLKEMPrivateKeyParameters;
import org.bouncycastle.pqc.asn1.FalconPrivateKey;
import org.bouncycastle.pqc.asn1.FalconPublicKey;
import org.bouncycastle.pqc.crypto.falcon.FalconPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.ntru.NTRUPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.saber.SABERPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.frodo.FrodoPrivateKeyParameters;
import org.bouncycastle.pqc.asn1.XMSSMTKeyParams;
import org.bouncycastle.pqc.crypto.xmss.XMSSMTPrivateKeyParameters;
import org.bouncycastle.pqc.asn1.XMSSKeyParams;
import org.bouncycastle.pqc.crypto.xmss.XMSSPrivateKeyParameters;
import org.bouncycastle.pqc.asn1.CMCEPrivateKey;
import org.bouncycastle.pqc.asn1.CMCEPublicKey;
import org.bouncycastle.pqc.crypto.cmce.CMCEPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.picnic.PicnicPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.slhdsa.SLHDSAPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.sphincsplus.SPHINCSPlusPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.lms.HSSPrivateKeyParameters;
import org.bouncycastle.util.Encodable;
import org.bouncycastle.pqc.crypto.lms.Composer;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.pqc.crypto.lms.LMSPrivateKeyParameters;
import org.bouncycastle.util.Pack;
import org.bouncycastle.pqc.crypto.newhope.NHPrivateKeyParameters;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.pqc.asn1.SPHINCS256KeyParams;
import org.bouncycastle.pqc.asn1.PQCObjectIdentifiers;
import org.bouncycastle.pqc.crypto.sphincs.SPHINCSPrivateKeyParameters;
import java.io.IOException;
import org.bouncycastle.asn1.ASN1Set;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;

public class PrivateKeyInfoFactory
{
    private PrivateKeyInfoFactory() {
    }
    
    public static PrivateKeyInfo createPrivateKeyInfo(final AsymmetricKeyParameter asymmetricKeyParameter) throws IOException {
        return createPrivateKeyInfo(asymmetricKeyParameter, null);
    }
    
    public static PrivateKeyInfo createPrivateKeyInfo(final AsymmetricKeyParameter asymmetricKeyParameter, final ASN1Set set) throws IOException {
        if (asymmetricKeyParameter instanceof SPHINCSPrivateKeyParameters) {
            final SPHINCSPrivateKeyParameters sphincsPrivateKeyParameters = (SPHINCSPrivateKeyParameters)asymmetricKeyParameter;
            return new PrivateKeyInfo(new AlgorithmIdentifier(PQCObjectIdentifiers.sphincs256, new SPHINCS256KeyParams(Utils.sphincs256LookupTreeAlgID(sphincsPrivateKeyParameters.getTreeDigest()))), new DEROctetString(sphincsPrivateKeyParameters.getKeyData()));
        }
        if (asymmetricKeyParameter instanceof NHPrivateKeyParameters) {
            final NHPrivateKeyParameters nhPrivateKeyParameters = (NHPrivateKeyParameters)asymmetricKeyParameter;
            final AlgorithmIdentifier algorithmIdentifier = new AlgorithmIdentifier(PQCObjectIdentifiers.newHope);
            final short[] secData = nhPrivateKeyParameters.getSecData();
            final byte[] array = new byte[secData.length * 2];
            for (int i = 0; i != secData.length; ++i) {
                Pack.shortToLittleEndian(secData[i], array, i * 2);
            }
            return new PrivateKeyInfo(algorithmIdentifier, new DEROctetString(array));
        }
        if (asymmetricKeyParameter instanceof LMSPrivateKeyParameters) {
            final LMSPrivateKeyParameters lmsPrivateKeyParameters = (LMSPrivateKeyParameters)asymmetricKeyParameter;
            return new PrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.id_alg_hss_lms_hashsig), new DEROctetString(Composer.compose().u32str(1).bytes(lmsPrivateKeyParameters).build()), set, Composer.compose().u32str(1).bytes(lmsPrivateKeyParameters.getPublicKey()).build());
        }
        if (asymmetricKeyParameter instanceof HSSPrivateKeyParameters) {
            final HSSPrivateKeyParameters hssPrivateKeyParameters = (HSSPrivateKeyParameters)asymmetricKeyParameter;
            return new PrivateKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.id_alg_hss_lms_hashsig), new DEROctetString(Composer.compose().u32str(hssPrivateKeyParameters.getL()).bytes(hssPrivateKeyParameters).build()), set, Composer.compose().u32str(hssPrivateKeyParameters.getL()).bytes(hssPrivateKeyParameters.getPublicKey().getLMSPublicKey()).build());
        }
        if (asymmetricKeyParameter instanceof SPHINCSPlusPrivateKeyParameters) {
            final SPHINCSPlusPrivateKeyParameters sphincsPlusPrivateKeyParameters = (SPHINCSPlusPrivateKeyParameters)asymmetricKeyParameter;
            return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.sphincsPlusOidLookup(sphincsPlusPrivateKeyParameters.getParameters())), new DEROctetString(sphincsPlusPrivateKeyParameters.getEncoded()), set, sphincsPlusPrivateKeyParameters.getPublicKey());
        }
        if (asymmetricKeyParameter instanceof SLHDSAPrivateKeyParameters) {
            final SLHDSAPrivateKeyParameters slhdsaPrivateKeyParameters = (SLHDSAPrivateKeyParameters)asymmetricKeyParameter;
            return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.slhdsaOidLookup(slhdsaPrivateKeyParameters.getParameters())), slhdsaPrivateKeyParameters.getEncoded(), set);
        }
        if (asymmetricKeyParameter instanceof PicnicPrivateKeyParameters) {
            final PicnicPrivateKeyParameters picnicPrivateKeyParameters = (PicnicPrivateKeyParameters)asymmetricKeyParameter;
            return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.picnicOidLookup(picnicPrivateKeyParameters.getParameters())), new DEROctetString(picnicPrivateKeyParameters.getEncoded()), set);
        }
        if (asymmetricKeyParameter instanceof CMCEPrivateKeyParameters) {
            final CMCEPrivateKeyParameters cmcePrivateKeyParameters = (CMCEPrivateKeyParameters)asymmetricKeyParameter;
            return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.mcElieceOidLookup(cmcePrivateKeyParameters.getParameters())), new CMCEPrivateKey(0, cmcePrivateKeyParameters.getDelta(), cmcePrivateKeyParameters.getC(), cmcePrivateKeyParameters.getG(), cmcePrivateKeyParameters.getAlpha(), cmcePrivateKeyParameters.getS(), new CMCEPublicKey(cmcePrivateKeyParameters.reconstructPublicKey())), set);
        }
        if (asymmetricKeyParameter instanceof XMSSPrivateKeyParameters) {
            final XMSSPrivateKeyParameters xmssPrivateKeyParameters = (XMSSPrivateKeyParameters)asymmetricKeyParameter;
            return new PrivateKeyInfo(new AlgorithmIdentifier(PQCObjectIdentifiers.xmss, new XMSSKeyParams(xmssPrivateKeyParameters.getParameters().getHeight(), Utils.xmssLookupTreeAlgID(xmssPrivateKeyParameters.getTreeDigest()))), xmssCreateKeyStructure(xmssPrivateKeyParameters), set);
        }
        if (asymmetricKeyParameter instanceof XMSSMTPrivateKeyParameters) {
            final XMSSMTPrivateKeyParameters xmssmtPrivateKeyParameters = (XMSSMTPrivateKeyParameters)asymmetricKeyParameter;
            return new PrivateKeyInfo(new AlgorithmIdentifier(PQCObjectIdentifiers.xmss_mt, new XMSSMTKeyParams(xmssmtPrivateKeyParameters.getParameters().getHeight(), xmssmtPrivateKeyParameters.getParameters().getLayers(), Utils.xmssLookupTreeAlgID(xmssmtPrivateKeyParameters.getTreeDigest()))), xmssmtCreateKeyStructure(xmssmtPrivateKeyParameters), set);
        }
        if (asymmetricKeyParameter instanceof FrodoPrivateKeyParameters) {
            final FrodoPrivateKeyParameters frodoPrivateKeyParameters = (FrodoPrivateKeyParameters)asymmetricKeyParameter;
            return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.frodoOidLookup(frodoPrivateKeyParameters.getParameters())), new DEROctetString(frodoPrivateKeyParameters.getEncoded()), set);
        }
        if (asymmetricKeyParameter instanceof SABERPrivateKeyParameters) {
            final SABERPrivateKeyParameters saberPrivateKeyParameters = (SABERPrivateKeyParameters)asymmetricKeyParameter;
            return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.saberOidLookup(saberPrivateKeyParameters.getParameters())), new DEROctetString(saberPrivateKeyParameters.getEncoded()), set);
        }
        if (asymmetricKeyParameter instanceof NTRUPrivateKeyParameters) {
            final NTRUPrivateKeyParameters ntruPrivateKeyParameters = (NTRUPrivateKeyParameters)asymmetricKeyParameter;
            return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.ntruOidLookup(ntruPrivateKeyParameters.getParameters())), new DEROctetString(ntruPrivateKeyParameters.getEncoded()), set);
        }
        if (asymmetricKeyParameter instanceof FalconPrivateKeyParameters) {
            final FalconPrivateKeyParameters falconPrivateKeyParameters = (FalconPrivateKeyParameters)asymmetricKeyParameter;
            return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.falconOidLookup(falconPrivateKeyParameters.getParameters())), new FalconPrivateKey(0, falconPrivateKeyParameters.getSpolyf(), falconPrivateKeyParameters.getG(), falconPrivateKeyParameters.getSpolyF(), new FalconPublicKey(falconPrivateKeyParameters.getPublicKey())), set);
        }
        if (asymmetricKeyParameter instanceof MLKEMPrivateKeyParameters) {
            final MLKEMPrivateKeyParameters mlkemPrivateKeyParameters = (MLKEMPrivateKeyParameters)asymmetricKeyParameter;
            final AlgorithmIdentifier algorithmIdentifier2 = new AlgorithmIdentifier(Utils.mlkemOidLookup(mlkemPrivateKeyParameters.getParameters()));
            if (mlkemPrivateKeyParameters.getPreferredFormat() == 1) {
                return new PrivateKeyInfo(algorithmIdentifier2, new DERTaggedObject(false, 0, new DEROctetString(mlkemPrivateKeyParameters.getSeed())), set);
            }
            if (mlkemPrivateKeyParameters.getPreferredFormat() == 2) {
                return new PrivateKeyInfo(algorithmIdentifier2, new DEROctetString(mlkemPrivateKeyParameters.getEncoded()), set);
            }
            return new PrivateKeyInfo(algorithmIdentifier2, getBasicPQCEncoding(mlkemPrivateKeyParameters.getSeed(), mlkemPrivateKeyParameters.getEncoded()), set);
        }
        else {
            if (asymmetricKeyParameter instanceof NTRULPRimePrivateKeyParameters) {
                final NTRULPRimePrivateKeyParameters ntrulpRimePrivateKeyParameters = (NTRULPRimePrivateKeyParameters)asymmetricKeyParameter;
                final ASN1EncodableVector asn1EncodableVector = new ASN1EncodableVector();
                asn1EncodableVector.add(new DEROctetString(ntrulpRimePrivateKeyParameters.getEnca()));
                asn1EncodableVector.add(new DEROctetString(ntrulpRimePrivateKeyParameters.getPk()));
                asn1EncodableVector.add(new DEROctetString(ntrulpRimePrivateKeyParameters.getRho()));
                asn1EncodableVector.add(new DEROctetString(ntrulpRimePrivateKeyParameters.getHash()));
                return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.ntrulprimeOidLookup(ntrulpRimePrivateKeyParameters.getParameters())), new DERSequence(asn1EncodableVector), set);
            }
            if (asymmetricKeyParameter instanceof SNTRUPrimePrivateKeyParameters) {
                final SNTRUPrimePrivateKeyParameters sntruPrimePrivateKeyParameters = (SNTRUPrimePrivateKeyParameters)asymmetricKeyParameter;
                final ASN1EncodableVector asn1EncodableVector2 = new ASN1EncodableVector();
                asn1EncodableVector2.add(new DEROctetString(sntruPrimePrivateKeyParameters.getF()));
                asn1EncodableVector2.add(new DEROctetString(sntruPrimePrivateKeyParameters.getGinv()));
                asn1EncodableVector2.add(new DEROctetString(sntruPrimePrivateKeyParameters.getPk()));
                asn1EncodableVector2.add(new DEROctetString(sntruPrimePrivateKeyParameters.getRho()));
                asn1EncodableVector2.add(new DEROctetString(sntruPrimePrivateKeyParameters.getHash()));
                return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.sntruprimeOidLookup(sntruPrimePrivateKeyParameters.getParameters())), new DERSequence(asn1EncodableVector2), set);
            }
            if (asymmetricKeyParameter instanceof MLDSAPrivateKeyParameters) {
                final MLDSAPrivateKeyParameters mldsaPrivateKeyParameters = (MLDSAPrivateKeyParameters)asymmetricKeyParameter;
                final AlgorithmIdentifier algorithmIdentifier3 = new AlgorithmIdentifier(Utils.mldsaOidLookup(mldsaPrivateKeyParameters.getParameters()));
                if (mldsaPrivateKeyParameters.getPreferredFormat() == 1) {
                    return new PrivateKeyInfo(algorithmIdentifier3, new DERTaggedObject(false, 0, new DEROctetString(mldsaPrivateKeyParameters.getSeed())), set);
                }
                if (mldsaPrivateKeyParameters.getPreferredFormat() == 2) {
                    return new PrivateKeyInfo(algorithmIdentifier3, new DEROctetString(mldsaPrivateKeyParameters.getEncoded()), set);
                }
                return new PrivateKeyInfo(algorithmIdentifier3, getBasicPQCEncoding(mldsaPrivateKeyParameters.getSeed(), mldsaPrivateKeyParameters.getEncoded()), set);
            }
            else {
                if (asymmetricKeyParameter instanceof DilithiumPrivateKeyParameters) {
                    final DilithiumPrivateKeyParameters dilithiumPrivateKeyParameters = (DilithiumPrivateKeyParameters)asymmetricKeyParameter;
                    return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.dilithiumOidLookup(dilithiumPrivateKeyParameters.getParameters())), new DEROctetString(dilithiumPrivateKeyParameters.getEncoded()), set, dilithiumPrivateKeyParameters.getPublicKeyParameters().getEncoded());
                }
                if (asymmetricKeyParameter instanceof BIKEPrivateKeyParameters) {
                    final BIKEPrivateKeyParameters bikePrivateKeyParameters = (BIKEPrivateKeyParameters)asymmetricKeyParameter;
                    return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.bikeOidLookup(bikePrivateKeyParameters.getParameters())), new DEROctetString(bikePrivateKeyParameters.getEncoded()), set);
                }
                if (asymmetricKeyParameter instanceof HQCPrivateKeyParameters) {
                    final HQCPrivateKeyParameters hqcPrivateKeyParameters = (HQCPrivateKeyParameters)asymmetricKeyParameter;
                    return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.hqcOidLookup(hqcPrivateKeyParameters.getParameters())), new DEROctetString(hqcPrivateKeyParameters.getEncoded()), set);
                }
                if (asymmetricKeyParameter instanceof RainbowPrivateKeyParameters) {
                    final RainbowPrivateKeyParameters rainbowPrivateKeyParameters = (RainbowPrivateKeyParameters)asymmetricKeyParameter;
                    return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.rainbowOidLookup(rainbowPrivateKeyParameters.getParameters())), new DEROctetString(rainbowPrivateKeyParameters.getEncoded()), set);
                }
                if (asymmetricKeyParameter instanceof MayoPrivateKeyParameters) {
                    final MayoPrivateKeyParameters mayoPrivateKeyParameters = (MayoPrivateKeyParameters)asymmetricKeyParameter;
                    return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.mayoOidLookup(mayoPrivateKeyParameters.getParameters())), new DEROctetString(mayoPrivateKeyParameters.getEncoded()), set);
                }
                if (asymmetricKeyParameter instanceof SnovaPrivateKeyParameters) {
                    final SnovaPrivateKeyParameters snovaPrivateKeyParameters = (SnovaPrivateKeyParameters)asymmetricKeyParameter;
                    return new PrivateKeyInfo(new AlgorithmIdentifier(Utils.snovaOidLookup(snovaPrivateKeyParameters.getParameters())), new DEROctetString(snovaPrivateKeyParameters.getEncoded()), set);
                }
                throw new IOException("key parameters not recognized");
            }
        }
    }
    
    private static XMSSPrivateKey xmssCreateKeyStructure(final XMSSPrivateKeyParameters xmssPrivateKeyParameters) throws IOException {
        final byte[] encoded = xmssPrivateKeyParameters.getEncoded();
        final int treeDigestSize = xmssPrivateKeyParameters.getParameters().getTreeDigestSize();
        final int height = xmssPrivateKeyParameters.getParameters().getHeight();
        final int n = 4;
        final int n2 = treeDigestSize;
        final int n3 = treeDigestSize;
        final int n4 = treeDigestSize;
        final int n5 = treeDigestSize;
        final int n6 = 0;
        final int n7 = (int)XMSSUtil.bytesToXBigEndian(encoded, n6, n);
        if (!XMSSUtil.isIndexValid(height, n7)) {
            throw new IllegalArgumentException("index out of bounds");
        }
        final int n8 = n6 + n;
        final byte[] bytesAtOffset = XMSSUtil.extractBytesAtOffset(encoded, n8, n2);
        final int n9 = n8 + n2;
        final byte[] bytesAtOffset2 = XMSSUtil.extractBytesAtOffset(encoded, n9, n3);
        final int n10 = n9 + n3;
        final byte[] bytesAtOffset3 = XMSSUtil.extractBytesAtOffset(encoded, n10, n4);
        final int n11 = n10 + n4;
        final byte[] bytesAtOffset4 = XMSSUtil.extractBytesAtOffset(encoded, n11, n5);
        final int n12 = n11 + n5;
        final byte[] bytesAtOffset5 = XMSSUtil.extractBytesAtOffset(encoded, n12, encoded.length - n12);
        BDS bds;
        try {
            bds = (BDS)XMSSUtil.deserialize(bytesAtOffset5, BDS.class);
        }
        catch (final ClassNotFoundException ex) {
            throw new IOException("cannot parse BDS: " + ex.getMessage());
        }
        if (bds.getMaxIndex() != (1 << height) - 1) {
            return new XMSSPrivateKey(n7, bytesAtOffset, bytesAtOffset2, bytesAtOffset3, bytesAtOffset4, bytesAtOffset5, bds.getMaxIndex());
        }
        return new XMSSPrivateKey(n7, bytesAtOffset, bytesAtOffset2, bytesAtOffset3, bytesAtOffset4, bytesAtOffset5);
    }
    
    private static ASN1Sequence getBasicPQCEncoding(final byte[] array, final byte[] array2) {
        return new DERSequence(new DEROctetString(array), new DEROctetString(array2));
    }
    
    private static XMSSMTPrivateKey xmssmtCreateKeyStructure(final XMSSMTPrivateKeyParameters xmssmtPrivateKeyParameters) throws IOException {
        final byte[] encoded = xmssmtPrivateKeyParameters.getEncoded();
        final int treeDigestSize = xmssmtPrivateKeyParameters.getParameters().getTreeDigestSize();
        final int height = xmssmtPrivateKeyParameters.getParameters().getHeight();
        final int n = (height + 7) / 8;
        final int n2 = treeDigestSize;
        final int n3 = treeDigestSize;
        final int n4 = treeDigestSize;
        final int n5 = treeDigestSize;
        final int n6 = 0;
        final int n7 = (int)XMSSUtil.bytesToXBigEndian(encoded, n6, n);
        if (!XMSSUtil.isIndexValid(height, n7)) {
            throw new IllegalArgumentException("index out of bounds");
        }
        final int n8 = n6 + n;
        final byte[] bytesAtOffset = XMSSUtil.extractBytesAtOffset(encoded, n8, n2);
        final int n9 = n8 + n2;
        final byte[] bytesAtOffset2 = XMSSUtil.extractBytesAtOffset(encoded, n9, n3);
        final int n10 = n9 + n3;
        final byte[] bytesAtOffset3 = XMSSUtil.extractBytesAtOffset(encoded, n10, n4);
        final int n11 = n10 + n4;
        final byte[] bytesAtOffset4 = XMSSUtil.extractBytesAtOffset(encoded, n11, n5);
        final int n12 = n11 + n5;
        final byte[] bytesAtOffset5 = XMSSUtil.extractBytesAtOffset(encoded, n12, encoded.length - n12);
        BDSStateMap bdsStateMap;
        try {
            bdsStateMap = (BDSStateMap)XMSSUtil.deserialize(bytesAtOffset5, BDSStateMap.class);
        }
        catch (final ClassNotFoundException ex) {
            throw new IOException("cannot parse BDSStateMap: " + ex.getMessage());
        }
        if (bdsStateMap.getMaxIndex() != (1L << height) - 1L) {
            return new XMSSMTPrivateKey(n7, bytesAtOffset, bytesAtOffset2, bytesAtOffset3, bytesAtOffset4, bytesAtOffset5, bdsStateMap.getMaxIndex());
        }
        return new XMSSMTPrivateKey(n7, bytesAtOffset, bytesAtOffset2, bytesAtOffset3, bytesAtOffset4, bytesAtOffset5);
    }
}
