package sese_020_001_02

import (
	"bytes"
	"encoding/xml"
	"time"
)

type ActiveCurrencyAndAmount struct {
	Value float64            `xml:",chardata"`
	Ccy   ActiveCurrencyCode `xml:"Ccy,attr"`
}

type ActiveCurrencyCode string

type ActiveOrHistoricCurrencyAndAmount struct {
	Value float64                      `xml:",chardata"`
	Ccy   ActiveOrHistoricCurrencyCode `xml:"Ccy,attr"`
}

type ActiveOrHistoricCurrencyCode string

type AddressType2Code string

type AmountAndDirection8 struct {
	Amt                 ActiveCurrencyAndAmount           `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Amt"`
	CdtDbtInd           CreditDebitCode                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 CdtDbtInd"`
	OrgnlCcyAndOrdrdAmt ActiveOrHistoricCurrencyAndAmount `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 OrgnlCcyAndOrdrdAmt,omitempty"`
}

type AnyBICIdentifier string

type CountryCode string

type CreditDebitCode string

type DateAndDateTimeChoice struct {
	Dt   ISODate     `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Dt"`
	DtTm ISODateTime `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 DtTm"`
}

type DateType3Code string

type DeliveryReceiptType2Code string

type Document struct {
	SctiesTxCxlReq SecuritiesTransactionCancellationRequestV02 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SctiesTxCxlReq"`
}

type DocumentNumber1Choice struct {
	ShrtNb  Exact3NumericText                 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 ShrtNb"`
	LngNb   ISO20022MessageIdentificationText `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 LngNb"`
	PrtryNb GenericIdentification19           `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrtryNb"`
}

type Exact3NumericText string

type Exact4AlphaNumericText string

type ExternalFinancialInstrumentIdentificationType1Code string

type FXCancellation1Choice struct {
	Ind   bool                    `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Ind"`
	Prtry GenericIdentification20 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Prtry"`
}

type FinancialInstrumentQuantity1Choice struct {
	Unit     float64 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Unit"`
	FaceAmt  float64 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 FaceAmt"`
	AmtsdVal float64 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AmtsdVal"`
}

type GenericDocumentIdentification1 struct {
	MsgNb DocumentNumber1Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 MsgNb,omitempty"`
	Id    Max35Text             `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
}

type GenericIdentification19 struct {
	Id      Max35Text `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
	Issr    Max35Text `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Issr"`
	SchmeNm Max35Text `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SchmeNm,omitempty"`
}

type GenericIdentification20 struct {
	Id      Exact4AlphaNumericText `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
	Issr    Max35Text              `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Issr"`
	SchmeNm Max35Text              `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SchmeNm,omitempty"`
}

type ISINIdentifier string

type ISO20022MessageIdentificationText string

type ISODate time.Time

func (t *ISODate) UnmarshalText(text []byte) error {
	return (*xsdDate)(t).UnmarshalText(text)
}
func (t ISODate) MarshalText() ([]byte, error) {
	return xsdDate(t).MarshalText()
}

type ISODateTime time.Time

func (t *ISODateTime) UnmarshalText(text []byte) error {
	return (*xsdDateTime)(t).UnmarshalText(text)
}
func (t ISODateTime) MarshalText() ([]byte, error) {
	return xsdDateTime(t).MarshalText()
}

type IdentificationSource3Choice struct {
	Cd    ExternalFinancialInstrumentIdentificationType1Code `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Cd"`
	Prtry Max35Text                                          `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Prtry"`
}

type Max140Text string

type Max16Text string

type Max350Text string

type Max35Text string

type Max70Text string

type NameAndAddress5 struct {
	Nm  Max350Text     `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Nm"`
	Adr PostalAddress1 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Adr,omitempty"`
}

type OriginalAndCurrentQuantities1 struct {
	FaceAmt  float64 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 FaceAmt"`
	AmtsdVal float64 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AmtsdVal"`
}

type OtherIdentification1 struct {
	Id  Max35Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
	Sfx Max16Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Sfx,omitempty"`
	Tp  IdentificationSource3Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Tp"`
}

type PartyIdentification36Choice struct {
	AnyBIC  AnyBICIdentifier        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AnyBIC"`
	PrtryId GenericIdentification19 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrtryId"`
}

type PartyIdentification37Choice struct {
	AnyBIC   AnyBICIdentifier        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AnyBIC"`
	PrtryId  GenericIdentification19 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrtryId"`
	NmAndAdr NameAndAddress5         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 NmAndAdr"`
	Ctry     CountryCode             `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Ctry"`
}

type PartyIdentification44Choice struct {
	AnyBIC   AnyBICIdentifier `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AnyBIC"`
	NmAndAdr NameAndAddress5  `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 NmAndAdr"`
	Ctry     CountryCode      `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Ctry"`
}

type PartyIdentification45Choice struct {
	AnyBIC   AnyBICIdentifier        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AnyBIC"`
	PrtryId  GenericIdentification19 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrtryId"`
	NmAndAdr NameAndAddress5         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 NmAndAdr"`
}

type PartyIdentification46 struct {
	Id     PartyIdentification44Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
	PrcgId Max35Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrcgId,omitempty"`
}

type PartyIdentificationAndAccount44 struct {
	Id        PartyIdentification45Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
	SfkpgAcct SecuritiesAccount13         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SfkpgAcct,omitempty"`
	PrcgId    Max35Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrcgId,omitempty"`
}

type PostalAddress1 struct {
	AdrTp       AddressType2Code `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AdrTp,omitempty"`
	AdrLine     []Max70Text      `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AdrLine,omitempty"`
	StrtNm      Max70Text        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 StrtNm,omitempty"`
	BldgNb      Max16Text        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 BldgNb,omitempty"`
	PstCd       Max16Text        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PstCd,omitempty"`
	TwnNm       Max35Text        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 TwnNm,omitempty"`
	CtrySubDvsn Max35Text        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 CtrySubDvsn,omitempty"`
	Ctry        CountryCode      `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Ctry"`
}

type Quantity6Choice struct {
	Qty             FinancialInstrumentQuantity1Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Qty"`
	OrgnlAndCurFace OriginalAndCurrentQuantities1      `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 OrgnlAndCurFace"`
}

type ReceiveDelivery1Code string

type References2Choice struct {
	SctiesSttlmTxId SettlementTypeAndIdentification3 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SctiesSttlmTxId"`
	SctiesFincgTxId SettlementTypeAndIdentification3 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SctiesFincgTxId"`
	IntraPosMvmntId Max35Text                        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 IntraPosMvmntId"`
	OthrTxId        GenericDocumentIdentification1   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 OthrTxId"`
}

type SecuritiesAccount13 struct {
	Id Max35Text               `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
	Tp GenericIdentification20 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Tp,omitempty"`
	Nm Max70Text               `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Nm,omitempty"`
}

type SecuritiesTransactionCancellationRequestV02 struct {
	AcctOwnrTxId      References2Choice           `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AcctOwnrTxId"`
	AcctSvcrTxId      Max35Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AcctSvcrTxId,omitempty"`
	MktInfrstrctrTxId Max35Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 MktInfrstrctrTxId,omitempty"`
	PrcrTxId          Max35Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrcrTxId,omitempty"`
	AcctOwnr          PartyIdentification36Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AcctOwnr,omitempty"`
	SfkpgAcct         SecuritiesAccount13         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SfkpgAcct"`
	TxDtls            TransactionDetails29        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 TxDtls,omitempty"`
	FxCxl             FXCancellation1Choice       `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 FxCxl,omitempty"`
	SplmtryData       []SupplementaryData1        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SplmtryData,omitempty"`
}

type SecurityIdentification14 struct {
	ISIN   ISINIdentifier         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 ISIN,omitempty"`
	OthrId []OtherIdentification1 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 OthrId,omitempty"`
	Desc   Max140Text             `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Desc,omitempty"`
}

type SettlementDate1Choice struct {
	Dt   DateAndDateTimeChoice     `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Dt"`
	DtCd SettlementDateCode1Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 DtCd"`
}

type SettlementDate4Code string

type SettlementDateCode1Choice struct {
	Cd    SettlementDate4Code     `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Cd"`
	Prtry GenericIdentification20 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Prtry"`
}

type SettlementParties13 struct {
	Dpstry PartyIdentification46           `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Dpstry,omitempty"`
	Pty1   PartyIdentificationAndAccount44 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Pty1,omitempty"`
	Pty2   PartyIdentificationAndAccount44 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Pty2,omitempty"`
	Pty3   PartyIdentificationAndAccount44 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Pty3,omitempty"`
	Pty4   PartyIdentificationAndAccount44 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Pty4,omitempty"`
	Pty5   PartyIdentificationAndAccount44 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Pty5,omitempty"`
}

type SettlementTypeAndIdentification3 struct {
	TxId          Max35Text                `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 TxId"`
	SctiesMvmntTp ReceiveDelivery1Code     `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SctiesMvmntTp"`
	Pmt           DeliveryReceiptType2Code `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Pmt"`
}

type SupplementaryData1 struct {
	PlcAndNm Max350Text                 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PlcAndNm,omitempty"`
	Envlp    SupplementaryDataEnvelope1 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Envlp"`
}

type SupplementaryDataEnvelope1 struct {
	Item string `xml:",any"`
}

type TradeDate1Choice struct {
	Dt   DateAndDateTimeChoice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Dt"`
	DtCd TradeDateCode1Choice  `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 DtCd"`
}

type TradeDateCode1Choice struct {
	Cd    DateType3Code           `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Cd"`
	Prtry GenericIdentification20 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Prtry"`
}

type TransactionDetails29 struct {
	FinInstrmId     SecurityIdentification14    `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 FinInstrmId"`
	TradDt          TradeDate1Choice            `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 TradDt,omitempty"`
	SttlmDt         SettlementDate1Choice       `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SttlmDt"`
	SttlmQty        Quantity6Choice             `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SttlmQty"`
	SttlmAmt        AmountAndDirection8         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SttlmAmt,omitempty"`
	DlvrgSttlmPties SettlementParties13         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 DlvrgSttlmPties,omitempty"`
	RcvgSttlmPties  SettlementParties13         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 RcvgSttlmPties,omitempty"`
	Invstr          PartyIdentification37Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Invstr,omitempty"`
}

type xsdDate time.Time

func (t *xsdDate) UnmarshalText(text []byte) error {
	return _unmarshalTime(text, (*time.Time)(t), "2006-01-02")
}
func (t xsdDate) MarshalText() ([]byte, error) {
	return _marshalTime((time.Time)(t), "2006-01-02")
}
func (t xsdDate) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
	if (time.Time)(t).IsZero() {
		return nil
	}
	m, err := t.MarshalText()
	if err != nil {
		return err
	}
	return e.EncodeElement(m, start)
}
func (t xsdDate) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
	if (time.Time)(t).IsZero() {
		return xml.Attr{}, nil
	}
	m, err := t.MarshalText()
	return xml.Attr{Name: name, Value: string(m)}, err
}
func _unmarshalTime(text []byte, t *time.Time, format string) (err error) {
	s := string(bytes.TrimSpace(text))
	*t, err = time.Parse(format, s)
	if _, ok := err.(*time.ParseError); ok {
		*t, err = time.Parse(format+"Z07:00", s)
	}
	return err
}
func _marshalTime(t time.Time, format string) ([]byte, error) {
	return []byte(t.Format(format + "Z07:00")), nil
}

type xsdDateTime time.Time

func (t *xsdDateTime) UnmarshalText(text []byte) error {
	return _unmarshalTime(text, (*time.Time)(t), "2006-01-02T15:04:05.999999999")
}
func (t xsdDateTime) MarshalText() ([]byte, error) {
	return _marshalTime((time.Time)(t), "2006-01-02T15:04:05.999999999")
}
func (t xsdDateTime) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
	if (time.Time)(t).IsZero() {
		return nil
	}
	m, err := t.MarshalText()
	if err != nil {
		return err
	}
	return e.EncodeElement(m, start)
}
func (t xsdDateTime) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
	if (time.Time)(t).IsZero() {
		return xml.Attr{}, nil
	}
	m, err := t.MarshalText()
	return xml.Attr{Name: name, Value: string(m)}, err
}
// Code generated by main. DO NOT EDIT.

package sese_020_001_02

import (
	"bytes"
	"encoding/xml"
	"time"
)

type ActiveCurrencyAndAmount struct {
	Value float64            `xml:",chardata"`
	Ccy   ActiveCurrencyCode `xml:"Ccy,attr"`
}

// Must match the pattern [A-Z]{3,3}
type ActiveCurrencyCode string

type ActiveOrHistoricCurrencyAndAmount struct {
	Value float64                      `xml:",chardata"`
	Ccy   ActiveOrHistoricCurrencyCode `xml:"Ccy,attr"`
}

// Must match the pattern [A-Z]{3,3}
type ActiveOrHistoricCurrencyCode string

// May be one of ADDR, PBOX, HOME, BIZZ, MLTO, DLVY
type AddressType2Code string

type AmountAndDirection8 struct {
	Amt                 ActiveCurrencyAndAmount           `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Amt"`
	CdtDbtInd           CreditDebitCode                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 CdtDbtInd"`
	OrgnlCcyAndOrdrdAmt ActiveOrHistoricCurrencyAndAmount `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 OrgnlCcyAndOrdrdAmt,omitempty"`
}

// Must match the pattern [A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}
type AnyBICIdentifier string

// Must match the pattern [A-Z]{2,2}
type CountryCode string

// May be one of CRDT, DBIT
type CreditDebitCode string

type DateAndDateTimeChoice struct {
	Dt   ISODate     `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Dt"`
	DtTm ISODateTime `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 DtTm"`
}

// May be one of VARI
type DateType3Code string

// May be one of FREE, APMT
type DeliveryReceiptType2Code string

type Document struct {
	SctiesTxCxlReq SecuritiesTransactionCancellationRequestV02 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SctiesTxCxlReq"`
}

type DocumentNumber1Choice struct {
	ShrtNb  Exact3NumericText                 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 ShrtNb"`
	LngNb   ISO20022MessageIdentificationText `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 LngNb"`
	PrtryNb GenericIdentification19           `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrtryNb"`
}

// Must match the pattern [0-9]{3}
type Exact3NumericText string

// Must match the pattern [a-zA-Z0-9]{4}
type Exact4AlphaNumericText string

// Must be at least 1 items long
type ExternalFinancialInstrumentIdentificationType1Code string

type FXCancellation1Choice struct {
	Ind   bool                    `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Ind"`
	Prtry GenericIdentification20 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Prtry"`
}

type FinancialInstrumentQuantity1Choice struct {
	Unit     float64 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Unit"`
	FaceAmt  float64 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 FaceAmt"`
	AmtsdVal float64 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AmtsdVal"`
}

type GenericDocumentIdentification1 struct {
	MsgNb DocumentNumber1Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 MsgNb,omitempty"`
	Id    Max35Text             `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
}

type GenericIdentification19 struct {
	Id      Max35Text `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
	Issr    Max35Text `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Issr"`
	SchmeNm Max35Text `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SchmeNm,omitempty"`
}

type GenericIdentification20 struct {
	Id      Exact4AlphaNumericText `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
	Issr    Max35Text              `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Issr"`
	SchmeNm Max35Text              `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SchmeNm,omitempty"`
}

// Must match the pattern [A-Z0-9]{12,12}
type ISINIdentifier string

// Must match the pattern [a-z]{4}\.[0-9]{3}\.[0-9]{3}\.[0-9]{2}
type ISO20022MessageIdentificationText string

type ISODate time.Time

func (t *ISODate) UnmarshalText(text []byte) error {
	return (*xsdDate)(t).UnmarshalText(text)
}
func (t ISODate) MarshalText() ([]byte, error) {
	return xsdDate(t).MarshalText()
}

type ISODateTime time.Time

func (t *ISODateTime) UnmarshalText(text []byte) error {
	return (*xsdDateTime)(t).UnmarshalText(text)
}
func (t ISODateTime) MarshalText() ([]byte, error) {
	return xsdDateTime(t).MarshalText()
}

type IdentificationSource3Choice struct {
	Cd    ExternalFinancialInstrumentIdentificationType1Code `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Cd"`
	Prtry Max35Text                                          `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Prtry"`
}

// Must be at least 1 items long
type Max140Text string

// Must be at least 1 items long
type Max16Text string

// Must be at least 1 items long
type Max350Text string

// Must be at least 1 items long
type Max35Text string

// Must be at least 1 items long
type Max70Text string

type NameAndAddress5 struct {
	Nm  Max350Text     `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Nm"`
	Adr PostalAddress1 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Adr,omitempty"`
}

type OriginalAndCurrentQuantities1 struct {
	FaceAmt  float64 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 FaceAmt"`
	AmtsdVal float64 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AmtsdVal"`
}

type OtherIdentification1 struct {
	Id  Max35Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
	Sfx Max16Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Sfx,omitempty"`
	Tp  IdentificationSource3Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Tp"`
}

type PartyIdentification36Choice struct {
	AnyBIC  AnyBICIdentifier        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AnyBIC"`
	PrtryId GenericIdentification19 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrtryId"`
}

type PartyIdentification37Choice struct {
	AnyBIC   AnyBICIdentifier        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AnyBIC"`
	PrtryId  GenericIdentification19 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrtryId"`
	NmAndAdr NameAndAddress5         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 NmAndAdr"`
	Ctry     CountryCode             `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Ctry"`
}

type PartyIdentification44Choice struct {
	AnyBIC   AnyBICIdentifier `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AnyBIC"`
	NmAndAdr NameAndAddress5  `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 NmAndAdr"`
	Ctry     CountryCode      `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Ctry"`
}

type PartyIdentification45Choice struct {
	AnyBIC   AnyBICIdentifier        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AnyBIC"`
	PrtryId  GenericIdentification19 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrtryId"`
	NmAndAdr NameAndAddress5         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 NmAndAdr"`
}

type PartyIdentification46 struct {
	Id     PartyIdentification44Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
	PrcgId Max35Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrcgId,omitempty"`
}

type PartyIdentificationAndAccount44 struct {
	Id        PartyIdentification45Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
	SfkpgAcct SecuritiesAccount13         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SfkpgAcct,omitempty"`
	PrcgId    Max35Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrcgId,omitempty"`
}

type PostalAddress1 struct {
	AdrTp       AddressType2Code `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AdrTp,omitempty"`
	AdrLine     []Max70Text      `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AdrLine,omitempty"`
	StrtNm      Max70Text        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 StrtNm,omitempty"`
	BldgNb      Max16Text        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 BldgNb,omitempty"`
	PstCd       Max16Text        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PstCd,omitempty"`
	TwnNm       Max35Text        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 TwnNm,omitempty"`
	CtrySubDvsn Max35Text        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 CtrySubDvsn,omitempty"`
	Ctry        CountryCode      `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Ctry"`
}

type Quantity6Choice struct {
	Qty             FinancialInstrumentQuantity1Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Qty"`
	OrgnlAndCurFace OriginalAndCurrentQuantities1      `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 OrgnlAndCurFace"`
}

// May be one of DELI, RECE
type ReceiveDelivery1Code string

type References2Choice struct {
	SctiesSttlmTxId SettlementTypeAndIdentification3 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SctiesSttlmTxId"`
	SctiesFincgTxId SettlementTypeAndIdentification3 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SctiesFincgTxId"`
	IntraPosMvmntId Max35Text                        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 IntraPosMvmntId"`
	OthrTxId        GenericDocumentIdentification1   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 OthrTxId"`
}

type SecuritiesAccount13 struct {
	Id Max35Text               `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Id"`
	Tp GenericIdentification20 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Tp,omitempty"`
	Nm Max70Text               `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Nm,omitempty"`
}

type SecuritiesTransactionCancellationRequestV02 struct {
	AcctOwnrTxId      References2Choice           `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AcctOwnrTxId"`
	AcctSvcrTxId      Max35Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AcctSvcrTxId,omitempty"`
	MktInfrstrctrTxId Max35Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 MktInfrstrctrTxId,omitempty"`
	PrcrTxId          Max35Text                   `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PrcrTxId,omitempty"`
	AcctOwnr          PartyIdentification36Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 AcctOwnr,omitempty"`
	SfkpgAcct         SecuritiesAccount13         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SfkpgAcct"`
	TxDtls            TransactionDetails29        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 TxDtls,omitempty"`
	FxCxl             FXCancellation1Choice       `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 FxCxl,omitempty"`
	SplmtryData       []SupplementaryData1        `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SplmtryData,omitempty"`
}

type SecurityIdentification14 struct {
	ISIN   ISINIdentifier         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 ISIN,omitempty"`
	OthrId []OtherIdentification1 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 OthrId,omitempty"`
	Desc   Max140Text             `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Desc,omitempty"`
}

type SettlementDate1Choice struct {
	Dt   DateAndDateTimeChoice     `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Dt"`
	DtCd SettlementDateCode1Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 DtCd"`
}

// May be one of WISS
type SettlementDate4Code string

type SettlementDateCode1Choice struct {
	Cd    SettlementDate4Code     `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Cd"`
	Prtry GenericIdentification20 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Prtry"`
}

type SettlementParties13 struct {
	Dpstry PartyIdentification46           `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Dpstry,omitempty"`
	Pty1   PartyIdentificationAndAccount44 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Pty1,omitempty"`
	Pty2   PartyIdentificationAndAccount44 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Pty2,omitempty"`
	Pty3   PartyIdentificationAndAccount44 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Pty3,omitempty"`
	Pty4   PartyIdentificationAndAccount44 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Pty4,omitempty"`
	Pty5   PartyIdentificationAndAccount44 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Pty5,omitempty"`
}

type SettlementTypeAndIdentification3 struct {
	TxId          Max35Text                `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 TxId"`
	SctiesMvmntTp ReceiveDelivery1Code     `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SctiesMvmntTp"`
	Pmt           DeliveryReceiptType2Code `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Pmt"`
}

type SupplementaryData1 struct {
	PlcAndNm Max350Text                 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 PlcAndNm,omitempty"`
	Envlp    SupplementaryDataEnvelope1 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Envlp"`
}

type SupplementaryDataEnvelope1 struct {
	Item string `xml:",any"`
}

type TradeDate1Choice struct {
	Dt   DateAndDateTimeChoice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Dt"`
	DtCd TradeDateCode1Choice  `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 DtCd"`
}

type TradeDateCode1Choice struct {
	Cd    DateType3Code           `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Cd"`
	Prtry GenericIdentification20 `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Prtry"`
}

type TransactionDetails29 struct {
	FinInstrmId     SecurityIdentification14    `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 FinInstrmId"`
	TradDt          TradeDate1Choice            `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 TradDt,omitempty"`
	SttlmDt         SettlementDate1Choice       `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SttlmDt"`
	SttlmQty        Quantity6Choice             `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SttlmQty"`
	SttlmAmt        AmountAndDirection8         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 SttlmAmt,omitempty"`
	DlvrgSttlmPties SettlementParties13         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 DlvrgSttlmPties,omitempty"`
	RcvgSttlmPties  SettlementParties13         `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 RcvgSttlmPties,omitempty"`
	Invstr          PartyIdentification37Choice `xml:"urn:iso:std:iso:20022:tech:xsd:sese.020.001.02 Invstr,omitempty"`
}

type xsdDate time.Time

func (t *xsdDate) UnmarshalText(text []byte) error {
	return _unmarshalTime(text, (*time.Time)(t), "2006-01-02")
}
func (t xsdDate) MarshalText() ([]byte, error) {
	return _marshalTime((time.Time)(t), "2006-01-02")
}
func (t xsdDate) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
	if (time.Time)(t).IsZero() {
		return nil
	}
	m, err := t.MarshalText()
	if err != nil {
		return err
	}
	return e.EncodeElement(m, start)
}
func (t xsdDate) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
	if (time.Time)(t).IsZero() {
		return xml.Attr{}, nil
	}
	m, err := t.MarshalText()
	return xml.Attr{Name: name, Value: string(m)}, err
}
func _unmarshalTime(text []byte, t *time.Time, format string) (err error) {
	s := string(bytes.TrimSpace(text))
	*t, err = time.Parse(format, s)
	if _, ok := err.(*time.ParseError); ok {
		*t, err = time.Parse(format+"Z07:00", s)
	}
	return err
}
func _marshalTime(t time.Time, format string) ([]byte, error) {
	return []byte(t.Format(format + "Z07:00")), nil
}

type xsdDateTime time.Time

func (t *xsdDateTime) UnmarshalText(text []byte) error {
	return _unmarshalTime(text, (*time.Time)(t), "2006-01-02T15:04:05.999999999")
}
func (t xsdDateTime) MarshalText() ([]byte, error) {
	return _marshalTime((time.Time)(t), "2006-01-02T15:04:05.999999999")
}
func (t xsdDateTime) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
	if (time.Time)(t).IsZero() {
		return nil
	}
	m, err := t.MarshalText()
	if err != nil {
		return err
	}
	return e.EncodeElement(m, start)
}
func (t xsdDateTime) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
	if (time.Time)(t).IsZero() {
		return xml.Attr{}, nil
	}
	m, err := t.MarshalText()
	return xml.Attr{Name: name, Value: string(m)}, err
}
