Z39-50-APDU-1995 
   -- OID for this definition, assigned in OID.3.1, is {Z39-50 2 1} 

DEFINITIONS ::=  
BEGIN   -- Z39.50-1995 Maintenance Agency Official Text for ANSI/NISO Z39.50-1995 - July 1995
--
EXPORTS OtherInformation, Term, AttributeSetId, AttributeList,
AttributeElement, ElementSetName, SortElement, DatabaseName, CompSpec,
Specification, Permissions, InternationalString, IntUnit, Unit,
StringOrNumeric, Query, Records, ResultSetId, DefaultDiagFormat, DiagRec;
--
PDU ::= CHOICE{
 initRequest                       [20] IMPLICIT InitializeRequest,
 initResponse                      [21] IMPLICIT InitializeResponse,
 searchRequest                     [22] IMPLICIT SearchRequest,
 searchResponse                    [23] IMPLICIT SearchResponse,
 presentRequest                    [24] IMPLICIT PresentRequest,
 presentResponse                   [25] IMPLICIT PresentResponse,
 deleteResultSetRequest            [26] IMPLICIT DeleteResultSetRequest,
 deleteResultSetResponse           [27] IMPLICIT DeleteResultSetResponse,
 accessControlRequest              [28] IMPLICIT AccessControlRequest,
 accessControlResponse             [29] IMPLICIT AccessControlResponse,
 resourceControlRequest            [30] IMPLICIT ResourceControlRequest,
 resourceControlResponse           [31] IMPLICIT ResourceControlResponse,
 triggerResourceControlRequest     [32] IMPLICIT TriggerResourceControlRequest,
 resourceReportRequest             [33] IMPLICIT ResourceReportRequest,
 resourceReportResponse            [34] IMPLICIT ResourceReportResponse,
 scanRequest                       [35] IMPLICIT ScanRequest,
 scanResponse                      [36] IMPLICIT ScanResponse,
                                       -- [37] through [42] reserved
 sortRequest                       [43] IMPLICIT SortRequest,
 sortResponse                      [44] IMPLICIT SortResponse,
 segmentRequest                    [45] IMPLICIT Segment,
 extendedServicesRequest           [46] IMPLICIT ExtendedServicesRequest,
 extendedServicesResponse          [47] IMPLICIT ExtendedServicesResponse,
 close                             [48] IMPLICIT Close}

-- Initialize APDUs
--

  InitializeRequest ::= SEQUENCE{
   referenceId                     ReferenceId OPTIONAL,
   protocolVersion                 ProtocolVersion,
   options                         Options,
   preferredMessageSize      [5]   IMPLICIT INTEGER,
   exceptionalRecordSize     [6]   IMPLICIT INTEGER,
   idAuthentication          [7]   ANY OPTIONAL, -- see note below
   implementationId          [110] IMPLICIT InternationalString OPTIONAL,
   implementationName        [111] IMPLICIT InternationalString OPTIONAL,
   implementationVersion     [112] IMPLICIT InternationalString OPTIONAL,        
   userInformationField      [11]  EXTERNAL OPTIONAL,
   otherInfo                       OtherInformation OPTIONAL}
--Note:
-- For idAuthentication, the type ANY is retained 
-- for compatibility with earlier versions. 
-- For interoperability, the following is recommended:
--   IdAuthentication [7] CHOICE{
--      open    VisibleString,
--      idPass  SEQUENCE {
--                 groupId   [0]   IMPLICIT InternationalString OPTIONAL,
--                 userId    [1]   IMPLICIT InternationalString OPTIONAL,
--                 password  [2]   IMPLICIT InternationalString OPTIONAL },
--      anonymous                  NULL,
--      other                      EXTERNAL    
-- May use access control formats for 'other'.  See Appendix 7 ACC.
--
  InitializeResponse ::= SEQUENCE{
   referenceId                     ReferenceId OPTIONAL,
   protocolVersion                 ProtocolVersion,
   options                         Options,
   preferredMessageSize      [5]   IMPLICIT INTEGER,
   exceptionalRecordSize     [6]   IMPLICIT INTEGER,
   result                    [12]  IMPLICIT BOOLEAN, 
                                    -- relect = FALSE; Accept = TRUE 
   implementationId          [110] IMPLICIT InternationalString OPTIONAL,
   implementationName        [111] IMPLICIT InternationalString OPTIONAL,
   implementationVersion     [112] IMPLICIT InternationalString OPTIONAL,        
   userInformationField      [11]  EXTERNAL OPTIONAL,
   otherInfo                       OtherInformation OPTIONAL}
-- Begin auxiliary definitions for Init PDUs
  ProtocolVersion  ::=       [3]   IMPLICIT BIT STRING{
                                   version-1           (0),   
                                -- This bit should always be set, but does not
                                -- correspond to any Z39.50 version.
      version-2              (1),  
                                -- "Version 2 supported."
                                -- This bit should always be set.
      version-3              (2)   
                                -- "Version 3 supported."
-- Values higher than 'version-3' should be ignored. Both the Initialize
-- request and Initialize Response APDUs include a value string corresponding
-- to the supported versions. The highest common version is selected
-- for use. If there are no versions in common, "Result" in the Init Response
-- should indicate "reject."
-- Note: Versions 1 and 2 are identical. Systems supporting version 2 should
-- indicate support for version 1 as well, for interoperability with systems
-- that indicate support for version 1 only (e.g. ISO 10163-1991
-- implementations).  
   }
  Options  ::= [4] IMPLICIT BIT STRING{ 
         search                 (0), 
         present                (1), 
         delSet                 (2),
         resourceReport         (3),
         triggerResourceCtrl    (4),
         resourceCtrl           (5), 
         accessCtrl             (6),
         scan                   (7),
         sort                   (8), 
         --                     (9) (reserved)
         extendedServices       (10),
         level-1Segmentation    (11),
         level-2Segmentation    (12),
         concurrentOperations   (13),
         namedResultSets        (14)}
-- end auxiliary definitions for Init PDUs


--Search APDUs
  SearchRequest ::= SEQUENCE{
   referenceId               ReferenceId OPTIONAL,
      smallSetUpperBound        [13]   IMPLICIT INTEGER,
   largeSetLowerBound           [14]   IMPLICIT INTEGER,
   mediumSetPresentNumber       [15]   IMPLICIT INTEGER,
   replaceIndicator             [16]   IMPLICIT BOOLEAN,
   resultSetName                [17]   IMPLICIT InternationalString,
   databaseNames                [18]   IMPLICIT SEQUENCE OF DatabaseName,
   smallSetElementSetNames      [100]  ElementSetNames OPTIONAL,
   mediumSetElementSetNames     [101]  ElementSetNames OPTIONAL,
   preferredRecordSyntax        [104]  IMPLICIT OBJECT IDENTIFIER OPTIONAL,
   query                        [21]   Query,
      -- Following two parameters may be used only if version 3 is in force.
   additionalSearchInfo         [203]  IMPLICIT OtherInformation OPTIONAL,
   otherInfo                           OtherInformation OPTIONAL}


-- Query Definitions
   Query  ::=   CHOICE{
         type-0    [0]    ANY,  
         type-1    [1]    IMPLICIT RPNQuery,
         type-2    [2]    OCTET STRING,
         type-100  [100]  OCTET STRING,
         type-101  [101]  IMPLICIT RPNQuery,
         type-102  [102]  OCTET STRING}
--
-- Definitions for RPN query
      RPNQuery ::= SEQUENCE{
         attributeSet        AttributeSetId,
         rpn                 RPNStructure}
--
  RPNStructure ::= CHOICE{
      op        [0] Operand, 
      rpnRpnOp  [1] IMPLICIT SEQUENCE{
                      rpn1      RPNStructure,
                      rpn2      RPNStructure,
                      op        Operator }} 
   Operand ::= CHOICE{
      attrTerm  AttributesPlusTerm, 
      resultSet    ResultSetId, 
             -- If version 2 is in force: 
             --   - If query type is 1, one of the above two must be chosen; 
             --   - resultAttr (below) may be used only if query type is 101. 
      resultAttr   ResultSetPlusAttributes}

   AttributesPlusTerm ::= [102] IMPLICIT SEQUENCE{
             attributes   AttributeList, 
             term         Term}

   ResultSetPlusAttributes ::= [214] IMPLICIT SEQUENCE{
             resultSet    ResultSetId,
             attributes   AttributeList}

   AttributeList ::=      [44]  IMPLICIT SEQUENCE OF AttributeElement
--
   Term ::= CHOICE{
      general      [45]   IMPLICIT OCTET STRING,
                   -- values below may be used only if version 3 is in force
      numeric             [215] IMPLICIT INTEGER,
      characterString     [216] IMPLICIT InternationalString,
      oid                 [217] IMPLICIT OBJECT IDENTIFIER,
      dateTime            [218] IMPLICIT GeneralizedTime,
      external            [219] IMPLICIT EXTERNAL,
      integerAndUnit      [220] IMPLICIT IntUnit,
      null                [221] IMPLICIT NULL}   

   Operator ::= [46] CHOICE{
              and     [0] IMPLICIT NULL,
              or      [1] IMPLICIT NULL,
              and-not [2] IMPLICIT NULL,
                          -- If version 2 is in force: 
                          --    -  For query type 1, one of the above three
                          --       must be chosen;
                          --  -    prox (below) may be used only if query type
                          --       is 101. 
             prox     [3] IMPLICIT ProximityOperator}

   AttributeElement  ::=  SEQUENCE{
      attributeSet    [1]       IMPLICIT AttributeSetId OPTIONAL,
                          -- Must be omitted if version 2 is in force.
                          -- If included, overrides value of attributeSet
                          -- in RPNQuery above, but only for this attribute.
      attributeType   [120]  IMPLICIT INTEGER,
      attributeValue      CHOICE{
                     numeric    [121]   IMPLICIT INTEGER,
                             -- If version 2 is in force, 
                             -- Must select 'numeric' for attributeValue.

        complex    [224] IMPLICIT SEQUENCE{ 
                          list     [1] IMPLICIT SEQUENCE OF StringOrNumeric,
                   semanticAction  [2] IMPLICIT SEQUENCE OF INTEGER OPTIONAL}}}
                                    

   ProximityOperator ::= SEQUENCE{
      exclusion           [1] IMPLICIT BOOLEAN OPTIONAL,
      distance            [2] IMPLICIT INTEGER,
      ordered             [3] IMPLICIT BOOLEAN,
      relationType        [4] IMPLICIT INTEGER{
                             lessThan               (1),
                             lessThanOrEqual        (2),
                             equal                  (3),
                             greaterThanOrEqual     (4),
                             greaterThan            (5),
                             notEqual               (6)},
      proximityUnitCode   [5] CHOICE{
                                known     [1] IMPLICIT KnownProximityUnit,
                                private   [2] IMPLICIT INTEGER}}
--
    KnownProximityUnit ::= INTEGER{
                character    (1),
                word         (2),
                sentence     (3),
                paragraph    (4),
                section      (5),
                chapter      (6),
                document     (7),
                element      (8),
                subelement   (9),
                elementType  (10),
                byte         (11) -- Version 3 only
                }
-- End definitions for RPN Query


SearchResponse ::= SEQUENCE{
   referenceId                     ReferenceId OPTIONAL,
   resultCount               [23]  IMPLICIT INTEGER,
   numberOfRecordsReturned   [24]  IMPLICIT INTEGER,
   nextResultSetPosition     [25]  IMPLICIT INTEGER,
   searchStatus              [22]  IMPLICIT BOOLEAN,
   resultSetStatus           [26]  IMPLICIT INTEGER{
                                       subset   (1),
                                       interim  (2), 
                                       none     (3)} OPTIONAL,
   presentStatus                   PresentStatus  OPTIONAL,
   records                         Records OPTIONAL,
      -- Following two parameters may be used only if version 3 is in force.
   additionalSearchInfo      [203] IMPLICIT OtherInformation OPTIONAL,
   otherInfo                       OtherInformation OPTIONAL}



--Retrieval APDUs 
  PresentRequest ::= SEQUENCE{
   referenceId                         ReferenceId OPTIONAL,
      resultSetId                      ResultSetId,
   resultSetStartPoint          [30]   IMPLICIT INTEGER,
   numberOfRecordsRequested     [29]   IMPLICIT INTEGER,
   additionalRanges             [212]  IMPLICIT SEQUENCE OF Range OPTIONAL,
         -- additionalRanges may be included only if version 3 is in force.
   recordComposition            CHOICE{
                                   simple    [19]   ElementSetNames,
                                          -- must choose 'simple' if version 2
                                          -- is in force
                                   complex   [209]  IMPLICIT CompSpec} OPTIONAL,
   preferredRecordSyntax     [104] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
   maxSegmentCount           [204] IMPLICIT INTEGER OPTIONAL, -- level 1 or 2
   maxRecordSize             [206] IMPLICIT INTEGER OPTIONAL, -- level 2 only
   maxSegmentSize            [207] IMPLICIT INTEGER OPTIONAL, -- level 2 only
   otherInfo                       OtherInformation OPTIONAL}
--

  Segment ::= SEQUENCE{
         -- Segment PDU may only be used when version 3 is in force, 
         -- and only when segmentation is in effect.
   referenceId                         ReferenceId OPTIONAL,
   numberOfRecordsReturned      [24]   IMPLICIT INTEGER,
   segmentRecords               [0]    IMPLICIT SEQUENCE OF NamePlusRecord,
   otherInfo                           OtherInformation OPTIONAL}
--
  PresentResponse ::= SEQUENCE{
   referenceId                     ReferenceId OPTIONAL,
   numberOfRecordsReturned   [24]  IMPLICIT INTEGER,
   nextResultSetPosition     [25]  IMPLICIT INTEGER,
   presentStatus                   PresentStatus,
   records                         Records OPTIONAL,
   otherInfo                       OtherInformation OPTIONAL} 
-- begin auxiliary definitions for Search and Present APDUs

-- begin definition of records
  Records ::= CHOICE{
   responseRecords              [28]   IMPLICIT SEQUENCE OF NamePlusRecord,
   nonSurrogateDiagnostic       [130]  IMPLICIT DefaultDiagFormat,
   multipleNonSurDiagnostics    [205]  IMPLICIT SEQUENCE OF DiagRec} 
--
  NamePlusRecord  ::=  SEQUENCE{
   name      [0] IMPLICIT DatabaseName OPTIONAL,
   record    [1] CHOICE{
             retrievalRecord           [1] EXTERNAL,
             surrogateDiagnostic       [2] DiagRec, 
                -- Must select one of the above two, retrievalRecord or
                -- surrogateDiagnostic, unless 'level 2 segmentation' 
                -- is in effect.
             startingFragment      [3] FragmentSyntax,
             intermediateFragment  [4] FragmentSyntax,
             finalFragment         [5] FragmentSyntax}}

   FragmentSyntax ::= CHOICE{
      externallyTagged       EXTERNAL,
      notExternallyTagged    OCTET STRING}

  DiagRec ::= CHOICE{
         defaultFormat       DefaultDiagFormat,
                      -- Must choose defaultFormat if version 2 is in effect.
         externallyDefined      EXTERNAL}

   DefaultDiagFormat::= SEQUENCE{ 
      diagnosticSetId        OBJECT IDENTIFIER,
      condition              INTEGER,
      addinfo                CHOICE{
                                v2Addinfo    VisibleString,         -- version 2
                                v3Addinfo    InternationalString    -- version 3
                     }}
  -- end definition of records

   Range  ::= SEQUENCE{
      startingPosition       [1] IMPLICIT INTEGER,
      numberOfRecords        [2] IMPLICIT INTEGER} 
--
   ElementSetNames ::= CHOICE {
      genericElementSetName     [0] IMPLICIT InternationalString,
      databaseSpecific          [1] IMPLICIT SEQUENCE OF SEQUENCE{
                                       dbName   DatabaseName,
                                       esn      ElementSetName}}


   PresentStatus   ::=    [27]  IMPLICIT INTEGER{
                                   success      (0),
                                   partial-1    (1),
                                   partial-2    (2),
                                   partial-3    (3),
                                   partial-4    (4),
                                   failure      (5)}

-- begin definition of composition specification
  CompSpec ::= SEQUENCE{
   selectAlternativeSyntax   [1] IMPLICIT BOOLEAN,
                                   -- See comment for recordSyntax, below.
   generic                   [2] IMPLICIT Specification OPTIONAL,
   dbSpecific                [3] IMPLICIT SEQUENCE OF SEQUENCE{
                                   db  [1] DatabaseName,
                                   spec   [2] IMPLICIT Specification} OPTIONAL,
                                -- At least one of generic and dbSpecific must
                                -- occur, and both may occur. If both, then for
                                -- any record not in the list of databases
                                -- within dbSpecific, generic applies.
   recordSyntax              [4] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER
                                                           OPTIONAL
                                -- For each record, the target selects the
                                -- first record syntax in this list that it can
                                -- support.  If the list is exhausted, the
                                -- target may select an alternative syntax if
                                -- selectAlternativeSyntax is 'true'.
             }

  Specification ::= SEQUENCE{
   schema          [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
   elementSpec     [2] CHOICE{
                      elementSetName   [1] IMPLICIT InternationalString,
                      externalEspec    [2] IMPLICIT EXTERNAL} OPTIONAL}
-- end definition of composition specification
-- end auxiliary definitions for search and response APDUs

-- Delete APDUs
  DeleteResultSetRequest ::= SEQUENCE{
   referenceId               ReferenceId OPTIONAL,
   deleteFunction     [32]   IMPLICIT INTEGER{
                                   list   (0),
                                   all    (1)},
   resultSetList             SEQUENCE OF ResultSetId OPTIONAL,
   otherInfo                 OtherInformation OPTIONAL} 
--
  DeleteResultSetResponse ::= SEQUENCE{
   referenceId                     ReferenceId OPTIONAL,
   deleteOperationStatus     [0]   IMPLICIT DeleteSetStatus,
   deleteListStatuses        [1]   IMPLICIT ListStatuses OPTIONAL,
   numberNotDeleted          [34]  IMPLICIT INTEGER OPTIONAL,
      bulkStatuses           [35]  IMPLICIT ListStatuses OPTIONAL,
   deleteMessage             [36]  IMPLICIT InternationalString OPTIONAL,
   otherInfo                       OtherInformation OPTIONAL}

   ListStatuses ::= SEQUENCE OF SEQUENCE{ 
             id       ResultSetId, 
             status   DeleteSetStatus}

   DeleteSetStatus ::= [33] IMPLICIT INTEGER{
                          success                             (0),
                          resultSetDidNotExist                (1),
                          previouslyDeletedByTarget           (2),
                          systemProblemAtTarget               (3),
                          accessNotAllowed                    (4),
                          resourceControlAtOrigin             (5),
                          resourceControlAtTarget             (6),
                          bulkDeleteNotSupported              (7),
                          notAllRsltSetsDeletedOnBulkDlte     (8),
                          notAllRequestedResultSetsDeleted    (9),
                          resultSetInUse                      (10)}
--

--Access- and Resource-control APDUs
--
  AccessControlRequest ::= SEQUENCE{
   referenceId            ReferenceId OPTIONAL,
   securityChallenge      CHOICE{
                             simpleForm         [37] IMPLICIT OCTET STRING,
                             externallyDefined  [0]  EXTERNAL},
   otherInfo              OtherInformation OPTIONAL}

  AccessControlResponse ::= SEQUENCE{
   referenceId                     ReferenceId OPTIONAL,
   securityChallengeResponse           CHOICE{
                                          simpleForm          [38]  IMPLICIT 
                                                                    OCTET STRING,
                                          externallyDefined   [0]   EXTERNAL}
                                                                    OPTIONAL,
                                   -- Optional only in version 3; mandatory in
                                   -- version 2. If omitted (in version 3) then
                                   -- diagnostic must occur.
   diagnostic                [223] DiagRec OPTIONAL, -- Version 3 only.
   otherInfo                       OtherInformation OPTIONAL}



  ResourceControlRequest ::= SEQUENCE{
   referenceId                     ReferenceId OPTIONAL,
   suspendedFlag             [39]  IMPLICIT BOOLEAN OPTIONAL,
   resourceReport            [40]  ResourceReport OPTIONAL,
   partialResultsAvailable   [41]  IMPLICIT INTEGER{
                                       subset   (1),
                                       interim  (2),
                                       none     (3)} OPTIONAL,
   responseRequired          [42]  IMPLICIT BOOLEAN, 
   triggeredRequestFlag      [43]  IMPLICIT BOOLEAN OPTIONAL,
   otherInfo                       OtherInformation OPTIONAL}


  ResourceControlResponse ::= SEQUENCE{
   referenceId                     ReferenceId OPTIONAL,
   continueFlag              [44]  IMPLICIT BOOLEAN, 
   resultSetWanted           [45]  IMPLICIT BOOLEAN OPTIONAL,
   otherInfo                       OtherInformation OPTIONAL}



  TriggerResourceControlRequest ::= SEQUENCE{
   referenceId                         ReferenceId OPTIONAL,
   requestedAction              [46]   IMPLICIT INTEGER{
                                          resourceReport      (1),
                                          resourceControl     (2),
                                          cancel              (3)}, 
   prefResourceReportFormat     [47]   IMPLICIT ResourceReportId OPTIONAL,
   resultSetWanted              [48]   IMPLICIT BOOLEAN OPTIONAL,
   otherInfo                           OtherInformation OPTIONAL}



  ResourceReportRequest ::= SEQUENCE{
   referenceId                         ReferenceId OPTIONAL,
   opId                         [210]  IMPLICIT ReferenceId OPTIONAL,
   prefResourceReportFormat     [49]   IMPLICIT ResourceReportId OPTIONAL,
   otherInfo                           OtherInformation OPTIONAL}
--
  ResourceReportResponse ::= SEQUENCE{
   referenceId                  ReferenceId OPTIONAL,
   resourceReportStatus   [50]  IMPLICIT INTEGER{
                                   success          (0),
                                   partial          (1),
                                   failure-1        (2),
                                   failure-2        (3),
                                   failure-3        (4),
                                   failure-4        (5),
                                   failure-5        (6),
                                   failure-6        (7)},
   resourceReport         [51]  ResourceReport OPTIONAL,
   otherInfo                    OtherInformation OPTIONAL}
--
   ResourceReport         ::=   EXTERNAL
   ResourceReportId       ::=   OBJECT IDENTIFIER

--Scan APDUs
  ScanRequest ::= SEQUENCE{
   referenceId                            ReferenceId OPTIONAL,
   databaseNames                   [3]    IMPLICIT SEQUENCE OF DatabaseName,
   attributeSet                           AttributeSetId OPTIONAL,
   termListAndStartPoint                  AttributesPlusTerm,
   stepSize                        [5]    IMPLICIT INTEGER OPTIONAL,
   numberOfTermsRequested          [6]    IMPLICIT INTEGER,
   preferredPositionInResponse     [7]    IMPLICIT INTEGER OPTIONAL,
   otherInfo                              OtherInformation OPTIONAL}

  ScanResponse ::= SEQUENCE{
   referenceId                         ReferenceId OPTIONAL,
   stepSize                     [3]    IMPLICIT INTEGER OPTIONAL,
   scanStatus                   [4]    IMPLICIT INTEGER {
                                       success  (0),
                                       partial-1    (1),
                                       partial-2    (2),
                                       partial-3    (3),
                                       partial-4    (4),
                                       partial-5    (5),
                                       failure  (6) },
   numberOfEntriesReturned      [5]    IMPLICIT INTEGER,
   positionOfTerm               [6]    IMPLICIT INTEGER OPTIONAL,
   entries                      [7]    IMPLICIT ListEntries  OPTIONAL,  
   attributeSet                 [8]    IMPLICIT AttributeSetId OPTIONAL,
   otherInfo                           OtherInformation OPTIONAL}


-- begin auxiliary definitions for Scan
  ListEntries ::= SEQUENCE{
   entries                   [1]   IMPLICIT SEQUENCE OF Entry OPTIONAL,
   nonsurrogateDiagnostics   [2]   IMPLICIT SEQUENCE OF DiagRec OPTIONAL
      -- At least one of entries and nonsurrogateDiagnostic must occur
                }

  Entry  ::= CHOICE {
   termInfo                  [1]   IMPLICIT TermInfo,
   surrogateDiagnostic       [2]   DiagRec}
--
  TermInfo ::= SEQUENCE {
   term                            Term,
   displayTerm        [0]    IMPLICIT InternationalString OPTIONAL,
                                -- Presence of displayTerm means that term is
                                -- not considered by the target to be suitable
                                -- for display, and displayTerm should instead
                                -- be displayed. 'term' is the actual term in
                                -- the term list; 'displayTerm' is for display
                                -- purposes only, and is not an actual term in
                                -- the term list.
   suggestedAttributes          AttributeList OPTIONAL,
   alternativeTerm        [4]   IMPLICIT SEQUENCE OF AttributesPlusTerm
                                                 OPTIONAL,
   globalOccurrences      [2]   IMPLICIT INTEGER OPTIONAL,
   byAttributes           [3]   IMPLICIT OccurrenceByAttributes OPTIONAL,
   otherTermInfo                OtherInformation OPTIONAL} 

  OccurrenceByAttributes ::= SEQUENCE OF SEQUENCE{
      attributes      [1]    AttributeList, 
      occurrences            CHOICE{
                                global       [2]    INTEGER,
                                byDatabase   [3]    IMPLICIT SEQUENCE OF
                                                     SEQUENCE{ 
                                                       db           DatabaseName,
                                                       num    [1]   IMPLICIT
                                                                 INTEGER OPTIONAL,
                                otherDbInfo         OtherInformation OPTIONAL}}
                                                                     OPTIONAL,
                                otherOccurInfo      OtherInformation OPTIONAL} 
-- end auxiliary definitions for Scan

-- Sort APDUs
SortRequest  ::= SEQUENCE{
   referenceId                  ReferenceId OPTIONAL,
   inputResultSetNames    [3]   IMPLICIT SEQUENCE OF InternationalString,
   sortedResultSetName    [4]   IMPLICIT InternationalString,
   sortSequence           [5]   IMPLICIT SEQUENCE OF SortKeySpec,
                                   -- order of occurrence is 
                                   -- from major to minor
   otherInfo                    OtherInformation OPTIONAL}

SortResponse  ::= SEQUENCE{
   referenceId                  ReferenceId OPTIONAL,
   sortStatus             [3]   IMPLICIT INTEGER{
                                   success   (0), 
                                   partial-1    (1),
                                   failure   (2)},
   resultSetStatus        [4]   IMPLICIT INTEGER{
                                   empty        (1), 
                                   interim      (2), 
                                   unchanged    (3),
                                   none         (4)} OPTIONAL,
   diagnostics            [5]   IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
   otherInfo                    OtherInformation OPTIONAL}

-- begin auxiliary definitions for Sort
   SortKeySpec ::= SEQUENCE{
     sortElement                   SortElement, 
        sortRelation         [1]   IMPLICIT INTEGER{
                                       ascending                 (0),
                                       descending                (1),
                                       ascendingByFrequency      (3),
                                       descendingByfrequency     (4)},
     caseSensitivity         [2]   IMPLICIT INTEGER{
                                       caseSensitive          (0), 
                                       caseInsensitive        (1)},
      missingValueAction     [3]   CHOICE{
                                       abort              [1] IMPLICIT NULL,
                                       null               [2] IMPLICIT NULL,
                                                          -- supply a null  value
                                                          -- for missing value
                                       missingValueData   [3] IMPLICIT OCTET
                                                               STRING} OPTIONAL}

   SortElement ::=    CHOICE{
     generic                 [1] SortKey,
        datbaseSpecific      [2] IMPLICIT SEQUENCE OF SEQUENCE{
                                   databaseName     DatabaseName,
                                   dbSort           SortKey}} 

   SortKey ::= CHOICE{
     sortfield        [0]    IMPLICIT InternationalString,
                                -- An element, element-group-tag, or alias
                                -- supported by the target and denoting a set
                                -- of elements associated with each record.
     elementSpec      [1]    IMPLICIT Specification,
     sortAttributes   [2]    IMPLICIT SEQUENCE{
                                id     AttributeSetId,
                                list   AttributeList}}
-- end auxiliary definitions for sort



-- Extended Service APDUs
  ExtendedServicesRequest  ::= SEQUENCE{
   referenceId                     ReferenceId OPTIONAL,
   function                  [3]   IMPLICIT INTEGER {
                                       create       (1),
                                       delete       (2),
                                       modify   (3)},
   packageType               [4]   IMPLICIT OBJECT IDENTIFIER,
   packageName               [5]   IMPLICIT InternationalString OPTIONAL,
                                       -- PackageName mandatory for 'modify' or
                                       -- 'delete'; optional for 'create'.
                                       -- Following four parameters mandatory
                                       -- for 'create'; should be included on
                                       -- 'modify' if being modified; not needed
                                       -- on 'delete'.
   userId                    [6]   IMPLICIT InternationalString OPTIONAL,
   retentionTime             [7]   IMPLICIT IntUnit OPTIONAL,
   permissions               [8]   IMPLICIT Permissions OPTIONAL,
   description               [9]   IMPLICIT InternationalString OPTIONAL,
   taskSpecificParameters    [10]  IMPLICIT EXTERNAL OPTIONAL, 
                                       -- Mandatory for 'create'; included on
                                       -- 'modify' if specific parameters being
                                       -- modified; not necessary on 'delete'.
                                       -- For the 'EXTERNAL,' use OID of
                                       -- specific ES definition and select
                                       -- CHOICE [1]: 'esRequest'.
   waitAction                [11]  IMPLICIT INTEGER{
                                       wait               (1),
                                       waitIfPossible     (2),
                                       dontWait           (3),
                                       dontReturnPackage  (4)},
   elements                        ElementSetName OPTIONAL,
   otherInfo                       OtherInformation OPTIONAL}
--

ExtendedServicesResponse ::= SEQUENCE{
   referenceId                     ReferenceId OPTIONAL,
   operationStatus           [3]   IMPLICIT INTEGER{
                                       done         (1),
                                       accepted     (2),  
                                       failure      (3)},
   diagnostics               [4]   IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
   taskPackage               [5]   IMPLICIT EXTERNAL OPTIONAL,
                                       -- Use OID: {Z39-50-recordSyntax (106)}
                                       -- and corresponding syntax. For the
                                       -- EXTERNAL, 'taskSpecific,' within that
                                       -- definition, use OID of the specific
                                       -- es, and choose [2], 'taskPackage'.
   otherInfo                       OtherInformation OPTIONAL}

 Permissions ::= SEQUENCE OF SEQUENCE{
   userId                 [1] IMPLICIT InternationalString,
   allowableFunctions     [2] IMPLICIT SEQUENCE OF INTEGER{
                                delete              (1),
                                modifyContents      (2),
                                modifyPermissions   (3),
                                present             (4),
                                   invoke           (5)}} 

Close ::= SEQUENCE{
   referenceId                     ReferenceId OPTIONAL,  -- See 3.2.11.1.5.
   closeReason                     CloseReason,
   diagnosticInformation     [3]   IMPLICIT InternationalString OPTIONAL,
   resourceReportFormat      [4]   IMPLICIT ResourceReportId OPTIONAL, 
                                       -- For use by origin only, and only on
                                       -- Close request; origin requests target
                                       -- to include report in response.
   resourceReport            [5]   ResourceReport OPTIONAL,
                                       -- For use by target only, unilaterally
                                       -- on Close request; on Close response
                                       -- may be unilateral or in response to
                                       -- origin request.
   otherInfo                       OtherInformation OPTIONAL}

   CloseReason ::=    [211]  IMPLICIT INTEGER{
                                finished            (0),
                                shutdown            (1),
                                systemProblem       (2),
                                costLimit           (3),
                                resources           (4),
                                securityViolation   (5),
                                protocolError       (6),
                                lackOfActivity      (7),
                                peerAbort           (8),
                                unspecified         (9)}


-- Global auxiliary definitions
   ReferenceId            ::=      [2]       IMPLICIT OCTET STRING
   ResultSetId            ::=      [31]      IMPLICIT InternationalString
   ElementSetName         ::=      [103]     IMPLICIT InternationalString
   DatabaseName           ::=      [105]     IMPLICIT InternationalString
   AttributeSetId         ::=                OBJECT IDENTIFIER


-- OtherInformation
   OtherInformation    ::= [201] IMPLICIT SEQUENCE OF SEQUENCE{
      category               [1]   IMPLICIT InfoCategory OPTIONAL, 
      information     CHOICE{
             characterInfo                [2]   IMPLICIT InternationalString,
             binaryInfo                   [3]   IMPLICIT OCTET STRING,
             externallyDefinedInfo        [4]   IMPLICIT EXTERNAL,
             oid                          [5]   IMPLICIT OBJECT IDENTIFIER}}
--
   InfoCategory ::= SEQUENCE{
         categoryTypeId   [1]   IMPLICIT OBJECT IDENTIFIER OPTIONAL,
         categoryValue    [2]   IMPLICIT INTEGER}


-- Units
   -- IntUnit is used when value and unit are supplied together. Unit, alone,
   -- is used when just  specifying a unit (without a value).  For example,
   -- IntUnit is used in Term, in an RPNQuery, or it can be the datatype of
   -- an element within a retrieval record. Unit (alone) would be used in an
   -- element request, when requesting data be returned according to a
   -- particular unit.

   IntUnit ::= SEQUENCE{
      value     [1] IMPLICIT INTEGER,
      unitUsed  [2] IMPLICIT Unit}
--
   Unit ::= SEQUENCE{
      unitSystem   [1] InternationalString OPTIONAL,      -- e.g. 'SI'
      unitType     [2] StringOrNumeric OPTIONAL,          -- e.g. 'mass'
      unit         [3] StringOrNumeric OPTIONAL,          -- e.g. 'kilograms'
      scaleFactor  [4] IMPLICIT INTEGER OPTIONAL          -- e.g. 9 means 10**9
             }

--CharacterString
   InternationalString ::= GeneralString
      -- When version 2 is in force, this collapses to VisibleString. That
      -- is, only characters in the visibleString repertoire may be used.
      -- (Datatype compatibility with version 2 is not affected, because
      -- references are IMPLICIT.)  When version 3 is in force, the semantics
      -- of the GeneralString content may be altered by negotiation during
      -- initialization. If no such  negotiation is in effect, then
      -- GeneralString semantics are in force.

StringOrNumeric ::= CHOICE{
   string       [1] IMPLICIT InternationalString,
   numeric      [2] IMPLICIT INTEGER}

END --IR DEFINITIONS





DiagnosticFormatDiag1 
{Z39-50-diagnosticFormat diag-1 (2)} DEFINITIONS ::=
BEGIN
IMPORTS Term, Specification, AttributeList, SortElement,
DatabaseName, 
DefaultDiagFormat, InternationalString FROM Z39-50-APDU-1995;


DiagnosticFormat ::=  SEQUENCE OF SEQUENCE{ 
   diagnostic   [1] CHOICE{
                     defaultDiagRec          [1]   IMPLICIT DefaultDiagFormat,
                     explicitDiagnostic      [2]   DiagFormat} OPTIONAL, 
   message      [2] IMPLICIT InternationalString OPTIONAL} 


DiagFormat ::= CHOICE{

tooMany         [1000]    IMPLICIT SEQUENCE{
                           tooManyWhat    [1]   IMPLICIT INTEGER{
                                                    argumentWords          (1), 
                                                    truncatedWords         (2), 
                                                    booleanOperators       (3),
                                                    incompleteSubfields    (4), 
                                                    characters             (5),
                                                    recordsRetrieved       (6), 
                                                    dataBasesSpecified     (7),
                                                    resultSetsCreated      (8), 
                                                    indexTermsProcessed    (9)},
                           max            [2]   IMPLICIT INTEGER OPTIONAL},


badSpec         [1001]   IMPLICIT SEQUENCE{  
                      -- element set name or specification
                        spec       [1] IMPLICIT Specification, 
                                          -- esn or element spec not supported
                        db         [2] IMPLICIT DatabaseName OPTIONAL,
                                          -- if db specified, above spec not
                                          -- supported for db; otherwise,
                                          -- spec not supported period.
                        goodOnes   [3] IMPLICIT SEQUENCE OF Specification
                                                                  OPTIONAL  
                                          -- target supplies ones that are
                                          -- supported
                                          },


dbUnavail       [1002]   IMPLICIT SEQUENCE{ -- database unavailable
                          db    [1] IMPLICIT DatabaseName,
                          why   [2] IMPLICIT SEQUENCE{
                                    reasonCode      [1] IMPLICIT INTEGER{
                                                          doesNotExist        (0),
                                                          existsButUnavail    (1),
                                                          locked              (2),
                                                          accessDenied        (3)}
                                                              OPTIONAL,
                                    message         [2] IMPLICIT
                                                InternationalString OPTIONAL}},


unSupOp         [1003]   IMPLICIT INTEGER{  -- unsupported operator
                          and       (0),
                          or        (1),
                          and-not   (2),
                          prox      (3)},


attribute       [1004]   IMPLICIT SEQUENCE{
                             -- Applies for unsupported attribute set,
                             -- attribute type, attribute value, or term (for
                             -- a given attribute type or value).
                        id         [1]    IMPLICIT OBJECT IDENTIFIER,
                                             -- if only "id" occurs, then
                                             -- attribute set is not supported
                        type       [2]    IMPLICIT INTEGER OPTIONAL,
                                             -- must occur if value occurs.
                        value      [3]    IMPLICIT INTEGER OPTIONAL,
                                             -- if omitted, and Type occurs,
                                             -- then Type is what is unsupported
                        term       [4]    Term OPTIONAL
                                             -- If occurs, term is illegal or
                                             -- not supported, for attribute
                                             -- value, if value occurs;
                                             -- otherwise, for type.
                                                },


attCombo     [1005]   IMPLICIT SEQUENCE{ 
                             -- attribute combination not supported
                          unsupportedCombination    [1] IMPLICIT AttributeList, 
                          recommendedAlternatives   [2] IMPLICIT SEQUENCE OF
                                                     AttributeList OPTIONAL}, 


term            [1006]   IMPLICIT SEQUENCE{
                           problem      [1] IMPLICIT INTEGER{
                                                codedValue   (1),
                                                unparsable   (2),
                                                tooShort     (3),
                                                type         (4)} OPTIONAL,
                           term         [2] Term},


proximity       [1007] CHOICE{            -- proximity diagnostics:
                          resultSets   [1] IMPLICIT NULL,             
                                             -- proximity between sets not
                                             -- supported
                          badSet       [2] IMPLICIT InternationalString,   
                                             -- bad result set specified
                          relation     [3] IMPLICIT INTEGER,         
                                             -- 1 to 6 ; relation not supported
                          unit         [4] IMPLICIT INTEGER,         
                                             -- unsupported unit code
                          distance     [5] IMPLICIT INTEGER,         
                                             -- unsupported distance
                          attributes   [6] AttributeList,                   
                                             --   proximity not supported with
                                             -- specified attribute combination
                          ordered      [7] IMPLICIT NULL,            
                                             -- ordered flag not supported
                          exclusion    [8] IMPLICIT NULL               
                                             -- exclusion flag not supported
                              },


scan            [1008] CHOICE{         -- scan diagnostics:
                          nonZeroStepSize    [0] IMPLICIT NULL,   
                                                    -- only zero step size    
                                                    -- supported
                          specifiedStepSize  [1] IMPLICIT NULL,   
                                                    -- specified step size not
                                                    -- supported
                          termList1          [3] IMPLICIT NULL,   
                                                    -- term list not supported
                                                    -- (no alternative supplied)
                          termList2          [4] IMPLICIT SEQUENCE OF
                                                           AttributeList,
                                                    -- term list not supported
                                                    -- (alternatives supplied)
                          posInResponse      [5] IMPLICIT INTEGER{   
                                                       -- value of positionIn-
                                                       -- Response not supported
                                                    mustBeOne              (1),
                                                    mustBePositive         (2),
                                                    mustBeNonNegative      (3),
                                                    other                  (4)},
                          resources         [6] IMPLICIT NULL,    
                                                    -- resources exhausted
                                                    -- looking for satisfying
                                                    -- terms
                          endOfList         [7] IMPLICIT NULL 
                                                    -- beginning or end of term
                                                    -- list
                        },


sort            [1009] CHOICE{
                          sequence           [0] IMPLICIT NULL,            
                                                    -- cannot sort according
                                                    -- to sequence
                          noRsName           [1] IMPLICIT NULL,            
                                                    -- no result set name
                                                    -- supplied
                          tooMany            [2] IMPLICIT INTEGER,         
                                                    --  Too many input result
                                                    -- sets, maximum supplied.
                          incompatible       [3] IMPLICIT NULL,            
                                                    -- records with different
                                                    -- formats not compatible for
                                                    -- sorting
                          generic            [4] IMPLICIT NULL,            
                                                    -- generic sort not supported
                                                    -- (db specific only)
                          dbSpecific         [5] IMPLICIT NULL,            
                                                    -- db specific sort not
                                                    -- supported
                          sortElement        [6] SortElement,
                          key                [7] IMPLICIT INTEGER{
                                                    tooMany      (1),      
                                                       -- too many sort keys
                                                    duplicate    (2)},      
                                                       -- duplicate sort keys
                          action             [8] IMPLICIT NULL,   
                                                -- unuspported missing data
                                                -- action
                          illegal            [9] IMPLICIT INTEGER{
                                                    relation   (1),   
                                                       -- illegal sort relation
                                                    case      (2),   
                                                       -- illegal case value
                                                    action   (3),    
                                                       -- illegal missing data
                                                       -- action
                                                    sort      (4)},   
                                                       -- illegal sort
                          inputTooLarge      [10] IMPLICIT SEQUENCE OF
                                                   InternationalString,
                                                       -- one or more of the
                                                       -- input result sets too
                                                       -- large to sort
                          aggregateTooLarge  [11] IMPLICIT NULL   
                                                       --  aggregate result set
                                                       -- too large
                                       },
segmentation  [1010]  CHOICE{
                segmentCount  [0]    IMPLICIT NULL,
                                       -- Cannot guarantee record will fit 
                                       -- within max segments. Target
                                       -- suggests that origin try again 
                                       -- to retrieve record, without
                                       -- including max-segment-count.
                segmentSize  [1]    IMPLICIT INTEGER
                                       -- record cannot be segmented into 
                                       -- fragments such that the largest 
                                       -- will fit within max segment 
                                       -- size specified. Target supplies (in 
                                       -- bytes) the smallest acceptable value.
                                       -- of Max-segment-size to retrieve 
                                       -- the record.
                          },

extServices     [1011] CHOICE{
                        req        [1] IMPLICIT INTEGER{    -- bad request
                                          nameInUse       (1),   
                                             -- package name already in use
                                          noSuchName      (2),   
                                             -- no such package, on
                                             -- modify/delete
                                          quota            (3),   
                                             -- quota exceeded
                                          type            (4)},   
                                             -- extended service type not
                                             -- supported
                      permission   [2] IMPLICIT INTEGER{ 
                                       -- permission denied on ES, because: 
                                          id             (1),      
                                             -- id not authorized, or
                                          modifyDelete   (2)},      
                                             -- cannot modify or delete
                      immediate    [3] IMPLICIT INTEGER{ 
                                       -- immediate execution:
                                          failed          (1),      
                                          service         (2),      
                                             -- not supported for this service, 
                                         parameters       (3)      
                                             -- not supported for these
                                             -- parameters.
                                                }},


accessCtrl      [1012] CHOICE{
                          noUser       [1] IMPLICIT NULL,      
                                             -- no user to display challenge to
                          refused      [2] IMPLICIT NULL,      
                                             -- access control information
                                             -- refused by user
                          simple       [3] IMPLICIT NULL,      
                                             -- only simple form supported
                                             -- (target used externally defined)
                          oid          [4] IMPLICIT SEQUENCE OF OBJECT
                                                     IDENTIFIER,
                                             -- oid not supported (origin
                                             -- supplies alternative suggested
                                             -- oids)
                        alternative    [5] IMPLICIT SEQUENCE OF OBJECT
                                                     IDENTIFIER,
                                             -- origin insists that target use
                                             -- an alternative challenge for
                                             -- this data (e.g. stronger       
                                             -- authentication or stronger
                                             -- Access control). The origin
                                             -- supplies suggested alternative
                                             -- oids.
                        pwdInv         [6] IMPLICIT NULL,      
                                             -- password invalid
                        pwdExp         [7] IMPLICIT NULL        
                                             -- password expired
                              },


recordSyntax   [1013] IMPLICIT SEQUENCE{ 
                   -- record cannot be transferred in requested syntax
                          unsupportedSyntax         [1] IMPLICIT OBJECT
                                                           IDENTIFIER, 
                          suggestedAlternatives     [2] IMPLICIT SEQUENCE OF
                                                        OBJECT IDENTIFIER
                                                           OPTIONAL}
}
END






RecordSyntax-explain 
{Z39-50-recordSyntax explain (100)} DEFINITIONS ::=

BEGIN 
IMPORTS AttributeSetId, Term, OtherInformation, DatabaseName, ElementSetName,
IntUnit, Unit, StringOrNumeric, Specification, InternationalString,
AttributeList, AttributeElement FROM Z39-50-APDU-1995;

Explain-Record ::= CHOICE{
   -- Each of these may be used as search term  
   -- when Use attribute is 'explain-category'.
  targetInfo                 [0]   IMPLICIT TargetInfo,
  databaseInfo               [1]   IMPLICIT DatabaseInfo,
  schemaInfo                 [2]   IMPLICIT SchemaInfo,
  tagSetInfo                 [3]   IMPLICIT TagSetInfo,
  recordSyntaxInfo           [4]   IMPLICIT RecordSyntaxInfo,
  attributeSetInfo           [5]   IMPLICIT AttributeSetInfo,
  termListInfo               [6]   IMPLICIT TermListInfo,
  extendedServicesInfo       [7]   IMPLICIT ExtendedServicesInfo,
  attributeDetails           [8]   IMPLICIT AttributeDetails,
  termListDetails            [9]   IMPLICIT TermListDetails,
  elementSetDetails          [10]  IMPLICIT ElementSetDetails,
  retrievalRecordDetails     [11]  IMPLICIT RetrievalRecordDetails,
  sortDetails                [12]  IMPLICIT SortDetails,
  processing                 [13]  IMPLICIT ProcessingInformation,
  variants                   [14]  IMPLICIT VariantSetInfo,
  units                      [15]  IMPLICIT UnitInfo,
  categoryList               [100] IMPLICIT CategoryList}

-- Element set name 'B' (brief)  retrieves:
--   -  'commonInfo' (except for otherInfo within commonInfo)
--   -  key elements
--   -  other elements designated as 'non-key brief elements'
-- Esn 'description' retrieves brief elements as well as 'description', and
-- specific additional descriptive elements if designated.  
-- Element set name 'F' (full) retrieves all of the above, as well as those
-- designated as "non-brief elements". Some elements designated as OPTIONAL
-- may be madatory in full records, and are so identified. (Note that all 
-- elements that are not part of the brief element set must be designated as
-- OPTIONAL in the ASN.1, otherwise it would be illegal to omit them).
-- Other esns are defined (below) as needed.


-- - - - - - - - - - - - -   Info Records
  -- Info records are mainly for software consumption
  -- They describe individual entities within the target system:
  --     The target itself
  --     Individual databases
  --     Schemas
  --     Tag sets
  --     Record syntaxes
  --     Attribute sets
  --     Term lists
  --     Extended services
 --   The information about each Schema, Tag Set, Record Syntax and Attribute
 -- Set should match the universal definitions of these items. The only
 -- exception is that a target may omit any- items it doesn't support, for
 -- example the description of the BIB-1 attribute set may omit attributes
 -- that the target does not support under any circumstances.
 --   Databases that may be searched together can be listed in the
 -- dbCominations element of the TargetInfo record.  



TargetInfo ::= SEQUENCE {
  commonInfo          [0]    IMPLICIT CommonInfo OPTIONAL,
     -- Key elements follow:
  name                [1]    IMPLICIT InternationalString,
     -- Non-key brief elements follow:
  recent-news         [2]    IMPLICIT HumanString OPTIONAL,
  icon                [3]    IMPLICIT IconObject OPTIONAL,
  namedResultSets     [4]    IMPLICIT BOOLEAN,
  multipleDBsearch    [5]    IMPLICIT BOOLEAN,
  maxResultSets       [6]    IMPLICIT INTEGER OPTIONAL,
  maxResultSize       [7]    IMPLICIT INTEGER OPTIONAL,
  maxTerms            [8]    IMPLICIT INTEGER OPTIONAL,
  timeoutInterval     [9]    IMPLICIT IntUnit OPTIONAL,
  welcomeMessage      [10]   IMPLICIT HumanString OPTIONAL,
      -- non-brief elements follow:
      -- 'description' esn retrieves the following two (as well as brief):
  contactInfo         [11]   IMPLICIT ContactInfo OPTIONAL,
  description         [12]   IMPLICIT HumanString OPTIONAL,
  nicknames           [13]   IMPLICIT SEQUENCE OF InternationalString
                                              OPTIONAL,
  usage-restrictions  [14]   IMPLICIT HumanString OPTIONAL,
  paymentAddr         [15]   IMPLICIT HumanString OPTIONAL,
  hours               [16]   IMPLICIT HumanString OPTIONAL,
  dbCombinations      [17]   IMPLICIT SEQUENCE OF DatabaseList OPTIONAL,
  addresses           [18]   IMPLICIT SEQUENCE OF NetworkAddress OPTIONAL,
  languages           [101]  IMPLICIT SEQUENCE OF InternationalStringOPTIONAL,
                  -- Languages supported for message strings.  Each is a three-character
                  -- language code from Z39.53-1994.
-- characterSets      [102]  this tag reserved for "character sets supported for name and message strings".

   -- commonAccessInfo elements list objects the target supports. All objects
   -- listed in AccessInfo for any individual database should also be listed
   -- here.
  commonAccessInfo    [19]   IMPLICIT AccessInfo OPTIONAL}
--


DatabaseInfo ::= SEQUENCE {
         -- A target may provide "virtual databases" that are combinations of
         -- individual database. These databases are indicated by the
         -- presence of subDbs in the combination database's
         -- DatabaseDescription.
  commonInfo              [0]   IMPLICIT CommonInfo OPTIONAL,
    -- Key elements follow:
  name                    [1]   IMPLICIT DatabaseName,
    -- Non-key brief elements follow:
  explainDatabase         [2]   IMPLICIT NULL OPTIONAL,
                                   -- If present, this database is the Explain
                                   -- database, or an Explain database
                                   -- for a different  server,
                                   -- possibly on a different host. The means
                                   -- by which that server may be accessed is
                                   -- not addressed by this standard. One
                                   -- suggested possibility is an implementor
                                   -- agreement whereby the database name is a
                                   -- url which may be used to connect to the
                                   -- server.
  nicknames               [3]   IMPLICIT SEQUENCE OF DatabaseName OPTIONAL,
  icon                    [4]   IMPLICIT IconObject OPTIONAL,
  user-fee                [5]   IMPLICIT BOOLEAN,
  available               [6]   IMPLICIT BOOLEAN,
  titleString             [7]   IMPLICIT HumanString OPTIONAL,
    -- Non-brief elements follow:
  keywords                [8]   IMPLICIT SEQUENCE OF HumanString OPTIONAL,
  description             [9]   IMPLICIT HumanString OPTIONAL,
  associatedDbs           [10]  IMPLICIT DatabaseList OPTIONAL,
                                   -- databases that may be searched in
                                   -- combination with this one 
  subDbs                  [11   IMPLICIT DatabaseList OPTIONAL,
                                   -- When present, this database is a
                                   -- composite representing the combined
                                   -- databases 'subDbs'. The individual subDbs
                                   -- are also available.
  disclaimers             [12]  IMPLICIT HumanString OPTIONAL,
  news                    [13]  IMPLICIT HumanString OPTIONAL,
  recordCount             [14]  CHOICE {
                                   actualNumber   [0] IMPLICIT INTEGER,
                                   approxNumber   [1] IMPLICIT INTEGER}
                                                           OPTIONAL,
  defaultOrder            [15]  IMPLICIT HumanString OPTIONAL,
  avRecordSize            [16]  IMPLICIT INTEGER OPTIONAL,
  maxRecordSize           [17]  IMPLICIT INTEGER OPTIONAL,
  hours                   [18]  IMPLICIT HumanString OPTIONAL,
  bestTime                [19]  IMPLICIT HumanString OPTIONAL,
  lastUpdate              [20]  IMPLICIT GeneralizedTime OPTIONAL,
  updateInterval          [21]  IMPLICIT IntUnit OPTIONAL,
  coverage                [22]  IMPLICIT HumanString OPTIONAL,
  proprietary             [23]  IMPLICIT BOOLEAN OPTIONAL, 
                                -- mandatory in full record
  copyrightText           [24]  IMPLICIT HumanString OPTIONAL,
  copyrightNotice         [25]  IMPLICIT HumanString OPTIONAL,
  producerContactInfo     [26]  IMPLICIT ContactInfo OPTIONAL,
  supplierContactInfo     [27]  IMPLICIT ContactInfo OPTIONAL,
  submissionContactInfo   [28]  IMPLICIT ContactInfo OPTIONAL,
      -- accessInfo lists items connected with the database. All listed items
      -- should be in the target's AccessInfo.
  accessInfo              [29]  IMPLICIT AccessInfo OPTIONAL}



SchemaInfo ::= SEQUENCE {
  commonInfo       [0] IMPLICIT CommonInfo OPTIONAL,
     -- Key elements follow:
  schema           [1] IMPLICIT OBJECT IDENTIFIER,
     -- Non-key brief elements follow:
  name             [2] IMPLICIT InternationalString,
     -- Non-brief elements follow:
  description      [3] IMPLICIT HumanString OPTIONAL,
  tagTypeMapping   [4] IMPLICIT SEQUENCE OF SEQUENCE {
                          tagType         [0] IMPLICIT INTEGER,
                          tagSet          [1] IMPLICIT OBJECT IDENTIFIER
                                                        OPTIONAL,
                                                -- If tagSet is omitted, then
                                                -- this tagType is for a tagSet
                                                -- locally defined within the
                                                -- schema that cannot be
                                                -- referenced by another schema.
                          defaultTagType  [2] IMPLICIT NULL OPTIONAL} OPTIONAL,
  recordStructure  [5] IMPLICIT SEQUENCE OF ElementInfo OPTIONAL}



   --  ElementInfo referenced in SchemaInfo and RecordSyntaxInfo
      ElementInfo ::= SEQUENCE {
         elementName      [1] IMPLICIT InternationalString,
         elementTagPath   [2] IMPLICIT Path,
         dataType         [3] ElementDataType OPTIONAL, 
                                -- If omitted, not specified. 
          required        [4] IMPLICIT BOOLEAN,
         repeatable       [5] IMPLICIT BOOLEAN,
          description     [6] IMPLICIT HumanString OPTIONAL}

   -- Path is referenced by ElementInfo as well as PerElementDetails
       Path ::= SEQUENCE OF SEQUENCE{
         tagType      [1] IMPLICIT INTEGER,
         tagValue     [2] StringOrNumeric}

      ElementDataType ::= CHOICE{
         primitive    [0] IMPLICIT PrimitiveDataType,
         structured   [1] IMPLICIT SEQUENCE OF ElementInfo}
         PrimitiveDataType ::= INTEGER{
                                octetString     (0),
                                numeric         (1),
                                date            (2),
                                external        (3),
                                string          (4),
                                trueOrFalse     (5),
                                oid             (6),
                                intUnit         (7),
                                empty           (8),
                                noneOfTheAbove  (100) -- see 'description'
                  }


TagSetInfo ::= SEQUENCE {
   commonInfo      [0]    IMPLICIT CommonInfo OPTIONAL,
     -- Key elements follow:
   tagSet          [1]    IMPLICIT OBJECT IDENTIFIER,
     -- non-key brief elements follow:
   name            [2]    IMPLICIT InternationalString,
     -- non-brief elements follow:
   description     [3]    IMPLICIT HumanString OPTIONAL,
   elements        [4]    IMPLICIT SEQUENCE OF SEQUENCE {
                             elementname  [1] IMPLICIT InternationalString,
                             nicknames    [2] IMPLICIT SEQUENCE OF
                                             InternationalString OPTIONAL,
                             elementTag   [3] StringOrNumeric, 
                             description  [4] IMPLICIT HumanString OPTIONAL, 
                             dataType     [5] PrimitiveDataType OPTIONAL,
                                                -- If the data type is expected
                                                -- to be structured, that is
                                                -- described in the schema info,
                                                -- and datatypeis omitted here.
   otherTagInfo           OtherInformation OPTIONAL} OPTIONAL}



RecordSyntaxInfo ::= SEQUENCE {
  commonInfo          [0] IMPLICIT CommonInfo OPTIONAL,
     -- Key elements follow:
  recordSyntax        [1] IMPLICIT OBJECT IDENTIFIER,
     -- Non-key brief elements follow:
  name                [2] IMPLICIT InternationalString,
     -- non-brief elements follow:
  transferSyntaxes    [3] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
  description         [4] IMPLICIT HumanString OPTIONAL,
  asn1Module          [5] IMPLICIT InternationalString OPTIONAL,
  abstractStructure   [6] IMPLICIT SEQUENCE OF ElementInfo OPTIONAL
                             -- Omitting abstractStructure only means target
                             -- isn't using Explain to describe the structure,
                             -- not that there is no structure.
                    }



AttributeSetInfo ::= SEQUENCE {
  commonInfo    [0] IMPLICIT CommonInfo OPTIONAL,
     -- Key elements follow:
  attributeSet  [1] IMPLICIT AttributeSetId,
     -- non-key brief elements follow:
  name          [2] IMPLICIT InternationalString,
     -- non-brief elements follow:
  attributes    [3] IMPLICIT SEQUENCE OF AttributeType OPTIONAL,
                        -- mandatory in full record
  description   [4] IMPLICIT HumanString OPTIONAL}



-- AttributeType referenced in AttributeSetInfo
   AttributeType ::= SEQUENCE {
         name             [0] IMPLICIT InternationalString OPTIONAL,
         description      [1] IMPLICIT HumanString OPTIONAL,
         attributeType    [2] IMPLICIT INTEGER,
         attributeValues  [3] IMPLICIT SEQUENCE OF AttributeDescription}

   AttributeDescription ::= SEQUENCE {
         name                   [0] IMPLICIT InternationalString OPTIONAL,
         description            [1] IMPLICIT HumanString OPTIONAL,
         attributeValue         [2] StringOrNumeric,
         equivalentAttributes   [3] IMPLICIT SEQUENCE OF StringOrNumeric
                                                 OPTIONAL
                                       -- each is an occurence of
                                       -- 'attributeValue' from
                                       --AttributeDescription for a
                                       -- different attribute. Equivalences
                                       -- listed here should be derived from the
                                       -- attribute set definition, not from a
                                       -- particular server's behavior.  
                              }


TermListInfo ::= SEQUENCE{
  commonInfo    [0]   IMPLICIT CommonInfo OPTIONAL,
     -- Key elements follow:
  databaseName  [1]   IMPLICIT DatabaseName,
     -- Non-key brief elements follow:
  termLists     [2] IMPLICIT SEQUENCE OF SEQUENCE{
                      name         [1] IMPLICIT InternationalString,
                      title        [2] IMPLICIT HumanString OPTIONAL,
                                          -- Title is for users to see 
                                          -- and can differ by language. 
                                          -- Name, on the other hand, is 
                                          -- typically a short string 
                                          -- not necessarily meant to be 
                                          -- human-readable, and not 
                                          -- variable by language. 
                      searchCost   [3] IMPLICIT INTEGER {
                                          optimized    (0),      
                                             -- The attribute (or combination)
                                             -- associated with this list will
                                             -- do fast searches. 
                                          normal       (1),      
                                             -- The attribute (combination) will
                                             -- work expected. So there's
                                             -- probably an index for the
                                             -- attribute (combination) or some
                                             -- similar mechanism.
                                          expensive    (2),      
                                             -- Can use the attribute
                                             -- (combination), but it might not
                                             -- provide satisfactory results. 
                                             -- Probably there is no index, or
                                             -- post-processing of records is
                                             -- required.
                                          filter       (3)      
                                             -- can't search with this
                                             -- attribute (combination) alone.
                                                    } OPTIONAL,
                    scanable       [4] IMPLICIT BOOLEAN, 
                                          -- 'true' means this list can be
                                          -- scanned. 
                     broader       [5] IMPLICIT SEQUENCE OF InternationalString
                                                     OPTIONAL,
                     narrower      [6] IMPLICIT SEQUENCE OF InternationalString
                                                     OPTIONAL
                                          -- broader and narrower list
                                          -- alternative term lists related to
                                          -- this one. The term lists so listed
                                          -- should also be in this termLists
                                          -- structure.
                                       }
   -- no non-brief elements
                  }




ExtendedServicesInfo ::= SEQUENCE {
  commonInfo          [0]    IMPLICIT CommonInfo OPTIONAL,
     -- Key elements follow:
  type                [1]    IMPLICIT OBJECT IDENTIFIER,
     -- Non-key brief elements follow:
  name                [2]    IMPLICIT InternationalString OPTIONAL,
                             -- should be supplied if privateType is 'true'
  privateType         [3]    IMPLICIT BOOLEAN,
  restrictionsApply   [5]    IMPLICIT BOOLEAN,  -- if 'true' see 'description'
  feeApply            [6]    IMPLICIT BOOLEAN,  -- if 'true' see 'description'
  available           [7]    IMPLICIT BOOLEAN,
  retentionSupported  [8]    IMPLICIT BOOLEAN,
  waitAction          [9]    IMPLICIT INTEGER{
                                waitSupported       (1),
                                waitAlways          (2),
                                waitNotSupported    (3),
                                depends             (4),
                                notSaying           (5)},
      -- non-brief elements follow:
      -- To get brief plus 'description' use esn 'description'
  description         [10]   IMPLICIT HumanString OPTIONAL,
      -- to get above elements and 'specificExplain' use esn 
      --'specificExplain'
  specificExplain     [11]   IMPLICIT EXTERNAL OPTIONAL,
                                -- Use oid of specific ES, and select choice
                                -- [3] 'explain'. Format to be developed in
                                -- conjunction with the specific ES definition.
      -- to get all elements except 'specificExplain', use esn 'asn'
  esASN               [12]   IMPLICITInternationalString OPTIONAL 
                                -- the ASN.1 for this ES
                        }

-- - - - - - - - - - - - - Detail records
 -- The detail records describe relationships among entities supported by the
 -- target. RetrievalRecordDetails describes the way that schema elements are
 -- mapped into record elements. This mapping may be different for each
 -- combination of database, schema, record syntax. The per-element details
 -- describe the default mapping. Origin-request re-tagging can change that
 -- mapping. When multiple databases are listed in a databaseNames element,
 -- the record applies equally to all of the listed databases.  This is
 -- unrelated to searching the databases together. AttributeDetails describes
 -- how databases can be searched. Each supported attribute is listed, and
 -- the allowable combinations can be described.

AttributeDetails ::= SEQUENCE {
  commonInfo              [0] IMPLICIT CommonInfo OPTIONAL,
     -- Key elements follow:
  databaseName            [1] IMPLICIT DatabaseName,
     -- Non-brief elements follow:
  attributesBySet         [2] IMPLICIT SEQUENCE OF AttributeSetDetails
                                    OPTIONAL, 
                                -- mandatory in full record
  attributeCombinations   [3] IMPLICIT AttributeCombinations OPTIONAL}


-- AttributeSetDetails referenced by AttributeDetails
   AttributeSetDetails ::= SEQUENCE {
         attributeSet        [0] IMPLICIT AttributeSetId,
         attributesByType    [1] IMPLICIT SEQUENCE OF AttributeTypeDetails}


   AttributeTypeDetails ::= SEQUENCE {
      attributeType       [0] IMPLICIT INTEGER,
      defaultIfOmitted    [1] IMPLICIT OmittedAttributeInterpretation OPTIONAL,
      attributeValues     [2] IMPLICIT SEQUENCE OF AttributeValue OPTIONAL }
                                -- If no attributeValues are supplied, all
                                -- values of this type are fully supported, and
                                -- the descriptions in AttributeSetInfo are
                                -- adequate.


   OmittedAttributeInterpretation ::= SEQUENCE {
      defaultValue           [0] StringOrNumeric OPTIONAL,
                                   -- A default value is listed if that's how
                                   -- the server works
      defaultDescription     [1] IMPLICIT HumanString OPTIONAL }
                                   -- The human-readable description should
                                   -- generally be provided. It is legal for
                                   -- both default elements to be missing,
                                   -- which means that the target will allow
                                   -- the attribute type to be omitted, but
                                   -- isn't saying what it will do.

AttributeValue ::= SEQUENCE {
  value            [0] StringOrNumeric,
  description      [1] IMPLICIT HumanString OPTIONAL,
  subAttributes    [2] IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL,
  superAttributes  [3] IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL,
  partialSupport   [4] IMPLICIT NULL OPTIONAL 
                          -- partialSupport indicates that an attributeValue is
                          -- accepted, but may not be processed in the
                          -- "expected" way. One important reason for this is
                          -- composite databases: in this case partialSupport
                          -- may indicate that only some of the subDbs support
                          -- the attribute, and others ignore it.
                      }


TermListDetails ::= SEQUENCE{  -- one for each termList in TermListInfo
  commonInfo       [0] IMPLICIT CommonInfo OPTIONAL,
     -- Key elements follow:
  termListName     [1] IMPLICIT InternationalString,
     -- Non-key elements (all non-brief) follow:
  description      [2] IMPLICIT HumanString OPTIONAL,
  attributes       [3] IMPLICIT AttributeCombinations OPTIONAL,
                          -- Pattern for attributes that hit this list.
                          -- Mandatory in full record
  scanInfo         [4] IMPLICIT SEQUENCE {
                          maxStepSize        [0] IMPLICIT INTEGER OPTIONAL,
                          collatingSequence  [1] IMPLICIT HumanString OPTIONAL,
                          increasing         [2] IMPLICIT BOOLEAN OPTIONAL}
                                                        OPTIONAL,
                            -- Occurs only if list is scanable. 
                            -- If list is scanable and if scanInfo is omitted, 
                            -- target doesn't consider these important.
  estNumberTerms   [5] IMPLICIT INTEGER OPTIONAL,
  sampleTerms      [6] IMPLICIT SEQUENCE OF Term OPTIONAL}



ElementSetDetails ::= SEQUENCE {
   -- ElementSetDetails describes the way that database records are mapped to
   -- record elements. This mapping may be different for each combination of
   -- database name and element set. The database record description is a
   -- schema, which may be private to the target. The schema's abstract
   -- record structure and tag sets provide the vocabulary for discussing
   -- record content; their presence in the Explain database does not imply
   -- support for complex retrieval specification.
  commonInfo          [0]   IMPLICIT CommonInfo OPTIONAL,
     -- Key elements follow:
  databaseName        [1] IMPLICIT DatabaseName,
  elementSetName      [2] IMPLICIT ElementSetName,
  recordSyntax        [3] IMPLICIT OBJECT IDENTIFIER,
     -- Non-key Brief elements follow:
  schema              [4] IMPLICIT OBJECT IDENTIFIER,
     -- Non-brief elements follow:
  description         [5] IMPLICIT HumanString OPTIONAL,
  detailsPerElement   [6] IMPLICIT SEQUENCE OF PerElementDetails OPTIONAL 
                             -- mandatory in full record
                     }



RetrievalRecordDetails ::= SEQUENCE {
  commonInfo          [0] IMPLICIT CommonInfo OPTIONAL,
     -- Key elements follow:
  databaseName        [1] IMPLICIT DatabaseName,
  schema              [2] IMPLICIT OBJECT IDENTIFIER,
  recordSyntax        [3] IMPLICIT OBJECT IDENTIFIER,
     -- Non-brief elements follow:
  description         [4] IMPLICIT HumanString OPTIONAL,
  detailsPerElement   [5] IMPLICIT SEQUENCE OF PerElementDetails OPTIONAL
                             -- mandatory in full record
                  }



-- PerElementDetails is referenced in RetreivalRecordDetails and
-- ElementSetDetails.
    PerElementDetails ::= SEQUENCE {
        name              [0]   IMPLICIT InternationalString OPTIONAL,
                                   -- If the name is omitted, the record
                                   -- syntax's name for this element is
                                   -- appropriate.
        recordTag         [1]   IMPLICIT RecordTag OPTIONAL,
                                   -- The record tag may be omitted if tags are
                                   -- inappropriate for the syntax, or if the
                                   -- origin can be expected to know it for
                                   -- some other reason.
        schemaTags        [2]   IMPLICIT SEQUENCE OF Path OPTIONAL,
                                   -- The information from the listed schema
                                   -- elements is in some way to produce the
                                   -- data sent in the listed record tag. The
                                   -- 'contents' element below may describe the
                                   -- the logic used.
        maxSize           [3]   IMPLICIT INTEGER OPTIONAL,
        minSize           [4]   IMPLICIT INTEGER OPTIONAL,
        avgSize           [5]   IMPLICIT INTEGER OPTIONAL,
        fixedSize         [6]   IMPLICIT INTEGER OPTIONAL,
        repeatable        [8]   IMPLICIT BOOLEAN,
        required          [9]   IMPLICIT BOOLEAN, 
                                   -- 'required' really means that target will
                                   -- always supply the element.
        description       [12]  IMPLICIT HumanString OPTIONAL,
        contents          [13]  IMPLICIT HumanString OPTIONAL,
        billingInfo       [14]  IMPLICIT HumanString OPTIONAL,
        restrictions      [15]  IMPLICIT HumanString OPTIONAL,
        alternateNames    [16]  IMPLICIT SEQUENCE OF InternationalString
                                    OPTIONAL,
        genericNames      [17]  IMPLICIT SEQUENCE OF InternationalString
                                    OPTIONAL,
        searchAccess      [18]  IMPLICIT AttributeCombinations OPTIONAL}

         -- RecordTag referenced in PerElementDetails above
            RecordTag ::= SEQUENCE {
                   qualifier    [0] StringOrNumeric OPTIONAL,
                                       -- E.g. tag set for GRS-1
                   tagValue     [1] StringOrNumeric}




SortDetails ::= SEQUENCE {
  commonInfo       [0] IMPLICIT CommonInfo OPTIONAL,
   -- Key elements follow:
  databaseName     [1] IMPLICIT DatabaseName,
     -- No non-key brief elements
     -- Non-brief elements follow:
  sortKeys         [2] IMPLICIT SEQUENCE OF SortKeyDetails OPTIONAL
                           -- mandatory in full record
               }

   SortKeyDetails ::= SEQUENCE {
        description                [0] IMPLICIT HumanString OPTIONAL,
        elementSpecifications      [1] IMPLICIT SEQUENCE OF Specification
                                                 OPTIONAL,
                                          -- each specification is a way of
                                          -- specifying this same sort key
        attributeSpecifications    [2] IMPLICIT AttributeCombinations OPTIONAL,
                                          -- each combination is a way of
                                          -- specifying this same sort key
        sortType                   [3] CHOICE {
                                          character    [0]   IMPLICIT NULL,
                                          numeric      [1]   IMPLICIT NULL,
                                          structured   [2]   IMPLICIT
                                                           HumanString} OPTIONAL,
        caseSensitivity            [4] IMPLICIT INTEGER {
                                          always       (0),   
                                             -- always case-sensitive
                                          never        (1),   
                                             -- never case-sensitive
                                          default-yes  (2),   
                                             -- case-sensitivity is as specified
                                             -- on request, and if not
                                             -- specified, case-sensitive.
                                          default-no   (3)
                                             -- case-sensitivity is as specified
                                             -- on request, and if not
                                             -- specified, not case-sensitive.
                                                          }
                                          OPTIONAL}



ProcessingInformation ::= SEQUENCE{
  commonInfo          [0]   IMPLICIT CommonInfo OPTIONAL,
     -- Key elements follow:
  databaseName        [1] IMPLICIT DatabaseName,
  processingContext   [2] IMPLICIT INTEGER {
                                access                 (0),    
                                   -- e.g. choosing databases
                                search                 (1),      
                                   -- e.g. "search strategies" or search forms 
                                retrieval              (2),    
                                   -- e.g. recommended element combinations 
                                record-presentation    (3),   
                                   -- display of retrieved records
                                record-handling        (4)          
                                   -- handling (e.g. saving) of retrieved
                                   -- records
                                                },
  name                [3] IMPLICIT InternationalString,
  oid                 [4] IMPLICIT OBJECT IDENTIFIER,
                             -- So origin can retreive brief record and
                             -- determine if it can handle 'instructions' when
                             -- retrieving the full record.
     -- No non-key brief elements
     -- Non-brief elements follow:
  description         [5] IMPLICIT HumanString OPTIONAL,
                            -- use element set name 'description' 
                            -- to retrieve all except instructions.
  instructions        [6] IMPLICIT EXTERNAL OPTIONAL -- mandatory in full record
                            }




VariantSetInfo ::= SEQUENCE {
      -- A record in this category describes a variant set definition, i.e.,
      -- classes, types, and values, for a specific variant set definition
      -- supported by the target. Support by the target of a particular
      -- variant set definition does not imply that the definition is
      -- supported for any specific database or element. 
  commonInfo    [0] IMPLICIT CommonInfo OPTIONAL,
   -- Key elements follow:
  variantSet    [1] IMPLICIT OBJECT IDENTIFIER,
   -- Non-key brief elements follow:
  name          [2] IMPLICIT InternationalString,
   -- Non-brief elements follow:
  variants      [3] IMPLICIT SEQUENCE OF VariantClass OPTIONAL
                      -- mandatory in full record
                }

   -- Subsidiary structures for VariantSetInfo
      VariantClass ::= SEQUENCE {
             name            [0] IMPLICIT InternationalString OPTIONAL,
             description     [1] IMPLICIT HumanString OPTIONAL,
             variantClass    [2] IMPLICIT INTEGER,
             variantTypes    [3] IMPLICIT SEQUENCE OF VariantType}

      VariantType ::= SEQUENCE {
             name            [0] IMPLICIT InternationalString OPTIONAL,
             description     [1] IMPLICIT HumanString OPTIONAL,
             variantType     [2] IMPLICIT INTEGER,
             variantValue    [3] IMPLICIT VariantValue OPTIONAL}

      VariantValue ::= SEQUENCE {
             dataType        [0] PrimitiveDataType,
             values          [1] ValueSet OPTIONAL }

      ValueSet ::= CHOICE {
             range           [0] IMPLICIT ValueRange,
             enumerated      [1] IMPLICIT SEQUENCE OF ValueDescription }

      ValueRange ::= SEQUENCE {
                          -- At last one the following must be supplied, both
                          -- may be supplied.
             lower           [0] ValueDescription OPTIONAL,
             upper           [1] ValueDescription OPTIONAL }

      ValueDescription ::= CHOICE{
             integer               INTEGER,
             string                InternationalString,
             octets                OCTET STRING,
             oid                   OBJECT IDENTIFIER,
             unit            [1]   IMPLICIT Unit,
             valueAndUnit    [2]   IMPLICIT IntUnit 
                -- oid and unit can't be used in a ValueRange
                  }



UnitInfo ::= SEQUENCE {
  commonInfo    [0] IMPLICIT CommonInfo OPTIONAL,
   -- Key elements follow:
  unitSystem    [1] IMPLICIT InternationalString,
    -- No non-key brief elements
    -- Non-brief elements follow:
  description   [2] IMPLICIT HumanString OPTIONAL,
  units         [3] IMPLICIT SEQUENCE OF UnitType OPTIONAL }
                            -- mandatory in full record

   -- Subsidiary structures for UnitInfo
      UnitType ::= SEQUENCE {
         name         [0] IMPLICIT InternationalString OPTIONAL,
         description  [1] IMPLICIT HumanString OPTIONAL,
         unitType     [2] StringOrNumeric,
         units        [3] IMPLICIT SEQUENCE OF Units}

      Units ::= SEQUENCE {
         name         [0] IMPLICIT InternationalString OPTIONAL,
         description  [1] IMPLICIT HumanString OPTIONAL,
         unit         [2] StringOrNumeric}



CategoryList ::= SEQUENCE {
  commonInfo    [0] IMPLICIT CommonInfo OPTIONAL,
         -- Only one record expected per Explain database. All elements
         -- appear in brief presentation.
  categories    [1] IMPLICIT SEQUENCE OF CategoryInfo }

      CategoryInfo ::= SEQUENCE {
         category            [1] IMPLICIT InternationalString,
         originalCategory    [2] IMPLICIT InternationalString OPTIONAL,
             description     [3] IMPLICIT HumanString OPTIONAL,
           asn1Module        [4] IMPLICIT InternationalString OPTIONAL}




-- - - - - - - - - - - - - - Subsidiary definitions

CommonInfo ::= SEQUENCE {
  dateAdded               [0]   IMPLICIT GeneralizedTime OPTIONAL,
  dateChanged             [1]   IMPLICIT GeneralizedTime OPTIONAL,
  expiry                  [2]   IMPLICIT GeneralizedTime OPTIONAL,
  humanString-Language    [3]   IMPLICIT LanguageCode OPTIONAL,
   -- following not to occur for brief:
  otherInfo                     OtherInformation OPTIONAL}

HumanString ::= SEQUENCE OF SEQUENCE {
             language     [0] IMPLICIT LanguageCode OPTIONAL,
             text         [1] IMPLICIT InternationalString}

IconObject ::= SEQUENCE OF SEQUENCE{
         -- Note that the "SEQUENCE OF" is to allow alternative
         -- representations of the same Icon; it is not intended to allow
         -- multiple icons.
   bodyType  [1] CHOICE{
                   ianaType     [1] IMPLICIT InternationalString,
                   z3950type    [2] IMPLICIT InternationalString,
                   otherType    [3] IMPLICIT InternationalString},
   content   [2] IMPLICIT OCTET STRING}


LanguageCode ::=InternationalString  
                           -- from ANSI/NISO Z39.53-1994

ContactInfo ::= SEQUENCE {
  name          [0] IMPLICIT InternationalString OPTIONAL,
  description   [1] IMPLICIT HumanString OPTIONAL,
  address       [2] IMPLICIT HumanString OPTIONAL,
  email         [3] IMPLICIT InternationalString OPTIONAL,
  phone         [4] IMPLICIT InternationalString OPTIONAL}

NetworkAddress ::= CHOICE {
  internetAddress            [0] IMPLICIT SEQUENCE {
                                   hostAddress  [0] IMPLICIT
                                                    InternationalString,
                                   port         [1] IMPLICIT INTEGER},
  osiPresentationAddress     [1] IMPLICIT SEQUENCE { 
                                   pSel      [0] IMPLICIT InternationalString, 
                                   sSel      [1] IMPLICITInternationalString
                                                        OPTIONAL,  
                                   tSel      [2] IMPLICITInternationalString
                                                        OPTIONAL,  
                                   nSap      [3] IMPLICIT InternationalString},
  other                      [2] IMPLICIT SEQUENCE {  
                                   type      [0] IMPLICIT InternationalString,
                                   address   [1] IMPLICIT InternationalString}}


AccessInfo ::= SEQUENCE {
      -- AccessInfo contains the fundmental information about what facilites
      -- are required to use this target or server. For example, if an origin
      -- can handle none of the record syntaxes a database can provide, 
      -- it might choose not to access the database.
  queryTypesSupported     [0] IMPLICIT SEQUENCE OF QueryTypeDetails OPTIONAL,
  diagnosticsSets         [1] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
  attributeSetIds         [2] IMPLICIT SEQUENCE OF AttributeSetId OPTIONAL,
  schemas                 [3] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
  recordSyntaxes          [4] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
  resourceChallenges      [5] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
  restrictedAccess        [6] IMPLICIT AccessRestrictions OPTIONAL,
  costInfo                [8] IMPLICIT Costs OPTIONAL,
  variantSets             [9] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
  elementSetNames         [10] IMPLICIT SEQUENCE OF ElementSetName OPTIONAL,
  unitSystems             [11] IMPLICIT SEQUENCE OF InternationalString}


-- begin auxiliary definitions for AccessInfo
-- Begin Query Details
QueryTypeDetails ::= CHOICE {
  private       [0]     IMPLICIT PrivateCapabilities,
  rpn           [1]     IMPLICIT RpnCapabilities,
  iso8777       [2]     IMPLICIT Iso8777Capabilities,
  z39-58        [100]   IMPLICIT HumanString,
  erpn          [101]   IMPLICIT RpnCapabilities,
  rankedList    [102]   IMPLICIT HumanString}


PrivateCapabilities ::= SEQUENCE {
  operators     [0] IMPLICIT SEQUENCE OF SEQUENCE {
                      operator     [0] IMPLICIT InternationalString,
                      description  [1] IMPLICIT HumanString OPTIONAL } OPTIONAL,
  searchKeys    [1] IMPLICIT SEQUENCE OF SearchKey OPTIONAL,  
                          -- field names that can be searched
  description   [2] IMPLICIT SEQUENCE OF HumanString OPTIONAL }


RpnCapabilities ::= SEQUENCE {
  operators                     [0] IMPLICIT SEQUENCE OF INTEGER OPTIONAL,
                                -- Omitted means all operators are supported.
  resultSetAsOperandSupported   [1] IMPLICIT BOOLEAN,
  restrictionOperandSupported   [2] IMPLICIT BOOLEAN,
  proximity                     [3] IMPLICIT ProximitySupport OPTIONAL}

Iso8777Capabilities ::= SEQUENCE {
  searchKeys    [0] IMPLICIT SEQUENCE OF SearchKey,  
                      -- field names that may be searched
  restrictions  [1] IMPLICIT HumanString OPTIONAL 
                      -- Omitted means supported, not specifying units.
                     }

ProximitySupport ::= SEQUENCE {
  anySupport       [0] IMPLICIT BOOLEAN,
                          -- 'false' means no proximity support, in which case
                          -- unitsSupported not supplied.
  unitsSupported   [1] IMPLICIT SEQUENCE OF CHOICE{  
                          known    [1] IMPLICIT INTEGER, 
                                -- values from KnownProximityUnit
                          private  [2] IMPLICIT SEQUENCE{  
                                          unit         [0] IMPLICIT INTEGER,  
                                          description  [1] HumanString OPTIONAL}}
                                              OPTIONAL}

SearchKey ::= SEQUENCE {
  searchKey     [0] IMPLICIT InternationalString,
  description   [1] IMPLICIT HumanString OPTIONAL }
-- End Query details



AccessRestrictions ::= SEQUENCE OF SEQUENCE {
  accessType          [0] INTEGER {
                          any                (0),
                          search             (1),
                          present            (2),
                          specific-elements  (3),
                          extended-services  (4),
                          by-database        (5)},
  accessText          [1]  IMPLICIT HumanString OPTIONAL,
  accessChallenges    [2]  IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL}


Costs ::= SEQUENCE {
  connectCharge    [0] IMPLICIT Charge OPTIONAL,     -- Per-connection charge
  connectTime      [1] IMPLICIT Charge OPTIONAL,     -- Time-based charge
  displayCharge    [2] IMPLICIT Charge OPTIONAL,     -- Per-record charge
  searchCharge     [3] IMPLICIT Charge OPTIONAL,     -- Per-search charge
  subscriptCharge  [4]   IMPLICIT Charge OPTIONAL,   -- Subscription charges
  otherCharges     [5] IMPLICIT SEQUENCE OF SEQUENCE{   -- Other charges
                          forWhat  [1] IMPLICIT HumanString,
                          charge   [2] IMPLICIT Charge} OPTIONAL} 

      Charge ::= SEQUENCE{
           cost       [1] IMPLICIT IntUnit,
           perWhat    [2] IMPLICIT Unit OPTIONAL,
                             -- e.g. "second," "minute," "line," "record"...
           text       [3] IMPLICIT HumanString OPTIONAL} 
-- End Auxiliary definitions for AccessInfo


DatabaseList ::= SEQUENCE OF DatabaseName

AttributeCombinations ::= SEQUENCE {
  defaultAttributeSet     [0] IMPLICIT AttributeSetId,
                                -- Default for the combinations. Also probably
                                -- a good choice for the default
                                -- in searches, but that isn't required.
  legalCombinations       [1] IMPLICIT SEQUENCE OF AttributeCombination }


AttributeCombination ::= SEQUENCE OF AttributeOccurrence
  -- An AttributeCombination is a pattern for legal combination of attributes


AttributeOccurrence ::= SEQUENCE {   
                -- An AttributeOccurrence lists the legal values for a
                -- specific attribute type in a combination.
   attributeSet       [0] IMPLICIT AttributeSetId OPTIONAL,
   attributeType      [1] IMPLICIT INTEGER,
   mustBeSupplied     [2] IMPLICIT NULL OPTIONAL,
   attributeValues    CHOICE {
                          any-or-none   [3] IMPLICIT NULL, 
                             -- All supported values are OK 
                          specific      [4] IMPLICIT SEQUENCE OF
                                              StringOrNumeric}}
                            -- Only these values allowed


END





RecordSyntax-SUTRS
{Z39-50-recordSyntax SUTRS (101)} DEFINITIONS ::=
BEGIN 
IMPORTS InternationalString  FROM Z39-50-APDU-1995;
        SutrsRecord ::= InternationalString
-- Line terminator is ASCII LF (X'0A').
-- Recommended maximum line length is 72 characters.
END





RecordSyntax-opac
{Z39-50-recordSyntax opac (102)} DEFINITIONS ::=
BEGIN 
IMPORTS InternationalString  FROM Z39-50-APDU-1995;

OPACRecord ::= SEQUENCE {
   bibliographicRecord    [1] IMPLICIT EXTERNAL OPTIONAL,
   holdingsData           [2] IMPLICIT SEQUENCE OF HoldingsRecord OPTIONAL}

HoldingsRecord ::=  CHOICE {
   marcHoldingsRecord     [1] IMPLICIT EXTERNAL,
   holdingsAndCirc        [2] IMPLICIT HoldingsAndCircData}

HoldingsAndCircData ::=  SEQUENCE {
                             -- the following elements are required to display
                             -- holdings in conformance with NISO standards.
   typeOfRecord       [1]    IMPLICIT InternationalString OPTIONAL,-- LDR 06
   encodingLevel      [2]    IMPLICIT InternationalString OPTIONAL, -- LDR 017
   format             [3]    IMPLICIT InternationalString OPTIONAL, -- 007
                                                                           -- 00-01
   receiptAcqStatus   [4]    IMPLICIT InternationalString OPTIONAL, -- 008 06
   generalRetention   [5]    IMPLICIT InternationalString OPTIONAL, -- 008 12
   completeness       [6]    IMPLICIT InternationalString OPTIONAL, -- 008 16
   dateOfReport       [7]    IMPLICIT InternationalString OPTIONAL, -- 008
                                                                           -- 26-31
   nucCode            [8]    IMPLICIT InternationalString OPTIONAL, -- 852 $a
   localLocation      [9]    IMPLICIT InternationalString OPTIONAL, -- 852 $b
   shelvingLocation   [10]   IMPLICIT InternationalString OPTIONAL, -- 852 $c
   callNumber         [11]   IMPLICIT InternationalString OPTIONAL, -- 852 $h
                                                                       -- and $i
   shelvingData       [12]   IMPLICIT InternationalString OPTIONAL, -- 852 $j
                                                                       -- thru $m
   copyNumber         [13]   IMPLICIT InternationalString OPTIONAL, -- 852 $t
   publicNote         [14]   IMPLICIT InternationalString OPTIONAL, -- 852 $z
   reproductionNote   [15]   IMPLICIT InternationalString OPTIONAL, -- 843
   termsUseRepro      [16]   IMPLICIT InternationalString OPTIONAL, -- 845
   enumAndChron       [17]   IMPLICIT InternationalString OPTIONAL, -- all 85x,
                                                                           --  86x
   volumes            [18]   IMPLICIT SEQUENCE OF Volume OPTIONAL, 
                                -- repeats for each volume held
   circulationData    [19]   IMPLICIT SEQUENCE OF CircRecord OPTIONAL 
                                -- repeats for each circulating item.
                  }

Volume ::=  SEQUENCE {
   enumeration        [1]    IMPLICIT InternationalString OPTIONAL,
   chronology         [2]    IMPLICIT InternationalString OPTIONAL,
   enumAndChron       [3]    IMPLICIT InternationalString OPTIONAL }

CircRecord ::=  SEQUENCE {
   availableNow       [1]    IMPLICIT BOOLEAN,
   availablityDate    [2]    IMPLICIT InternationalString OPTIONAL,
   availableThru      [3]    IMPLICIT InternationalString OPTIONAL,
   restrictions       [4]    IMPLICIT InternationalString OPTIONAL,
   itemId             [5]    IMPLICIT InternationalString OPTIONAL,
   renewable          [6]    IMPLICIT BOOLEAN,
   onHold             [7]    IMPLICIT BOOLEAN,
   enumAndChron       [8]    IMPLICIT InternationalString OPTIONAL,
   midspine           [9]    IMPLICIT InternationalString OPTIONAL,
   temporaryLocation  [10]   IMPLICIT InternationalString OPTIONAL}
END





RecordSyntax-summary

{Z39-50-recordSyntax summary (103)} DEFINITIONS ::=
BEGIN 
IMPORTS OtherInformation, InternationalString  FROM Z39-50-APDU-1995;

BriefBib ::= SEQUENCE {
   title                  [1]   IMPLICIT InternationalString,
   author                 [2]   IMPLICIT InternationalString OPTIONAL,
   callNumber             [3]   IMPLICIT InternationalString OPTIONAL,
   recordType             [4]   IMPLICIT InternationalString OPTIONAL,
   bibliographicLevel     [5]   IMPLICIT InternationalString OPTIONAL,
   format                 [6]   IMPLICIT SEQUENCE OF FormatSpec OPTIONAL,
   publicationPlace       [7]   IMPLICIT InternationalString OPTIONAL,
   publicationDate        [8]   IMPLICIT InternationalString OPTIONAL,
   targetSystemKey        [9]   IMPLICIT InternationalString OPTIONAL,
   satisfyingElement      [10]  IMPLICIT InternationalString OPTIONAL,
   rank                   [11]  IMPLICIT INTEGER OPTIONAL,
   documentId             [12]  IMPLICIT InternationalString OPTIONAL,
   abstract               [13]  IMPLICIT InternationalString OPTIONAL,
   otherInfo                    OtherInformation OPTIONAL}

         FormatSpec  ::=  SEQUENCE {
             type     [1] IMPLICIT InternationalString,
             size     [2] IMPLICIT INTEGER OPTIONAL,
             bestPosn [3] IMPLICIT INTEGER OPTIONAL}
END





RecordSyntax-generic  -- For detailed semantics, see Appendix RET.
{Z39-50-recordSyntax GRS-1 (105)} DEFINITIONS ::=
BEGIN 
EXPORTS Variant;
IMPORTS IntUnit, Unit, InternationalString, StringOrNumeric, Term 
FROM Z39-50-APDU-1995;

GenericRecord ::= SEQUENCE OF TaggedElement  
TaggedElement ::= SEQUENCE {
   tagType         [1] IMPLICIT INTEGER OPTIONAL,
                          -- If omitted, default should be supplied dynamically
                          -- by tagSet-M; otherwise it should be statically
                          -- specified by the schema.
   tagValue        [2] StringOrNumeric,
   tagOccurrence   [3] IMPLICIT INTEGER OPTIONAL,
                          -- Occurrence within the database record, and
                          -- relative to the parent. No default; if omitted,
                          -- target not telling or it is irrelevant.
   content         [4] ElementData,
   metaData        [5] IMPLICIT ElementMetaData OPTIONAL,
   appliedVariant  [6] IMPLICIT Variant OPTIONAL}

ElementData ::= CHOICE{
   octets                    OCTET STRING,
   numeric                   INTEGER,
   date                      GeneralizedTime,
   ext                       EXTERNAL,
   string                    InternationalString,
   trueOrFalse               BOOLEAN,
   oid                       OBJECT IDENTIFIER,
   intUnit            [1]    IMPLICIT IntUnit,
    elementNotThere   [2]    IMPLICIT NULL,  -- element requested but not there
   elementEmpty       [3]    IMPLICIT NULL,  -- element there, but empty
   noDataRequested    [4]    IMPLICIT NULL,  -- variant request said 'no data'
   diagnostic         [5]    IMPLICIT EXTERNAL,
   subtree            [6]    SEQUENCE OF TaggedElement 
                                -- recursive, for nested tags
                     }

ElementMetaData ::= SEQUENCE{
   seriesOrder        [1]    IMPLICIT Order OPTIONAL, 
                                -- only for a non-leaf node
   usageRight         [2]    IMPLICIT Usage OPTIONAL,
   hits               [3]    IMPLICIT SEQUENCE OF HitVector OPTIONAL,
   displayName        [4]    IMPLICIT InternationalString OPTIONAL, 
                                -- name for element that origin can use for
                                -- display
   supportedVariants  [5]    IMPLICIT SEQUENCE OF Variant OPTIONAL,
   message            [6]    IMPLICIT InternationalString OPTIONAL,
   elementDescriptor  [7]    IMPLICIT OCTET STRING OPTIONAL,
   surrogateFor       [8]    IMPLICIT TagPath OPTIONAL,  
                                -- the retrieved element is a surrogate for the
                                -- element given by this path
   surrogateElement   [9]    IMPLICIT TagPath OPTIONAL,
                                -- the element given by this path is a
                                -- surrogate for the retrieved element
     other            [99]   IMPLICIT EXTERNAL OPTIONAL}

            TagPath ::= SEQUENCE  OF SEQUENCE{
                tagType         [1] IMPLICIT INTEGER OPTIONAL,
                tagValue        [2] StringOrNumeric,
                tagOccurrence   [3] IMPLICIT INTEGER OPTIONAL}


Order ::= SEQUENCE{
   ascending      [1] IMPLICIT BOOLEAN,
                          -- "true" means monotonically increasing (i.e. non-
                          --  decreasing); "false" means monotonically
                          -- decreasing (i.e. non-increasing).
   order         [2] IMPLICIT INTEGER
                          -- Same as defined by 'elementOrdering' in tagSet-M,
                          -- though this may be overidden by schema.
               }

Usage ::= SEQUENCE   {
   type            [1] IMPLICIT INTEGER{
                          redistributable    (1),    
                             -- Element is freely redistributable.
                          restricted         (2),    
                             -- Restriction contains statement.
                          licensePointer     (3)    
                             -- Restriction contains license pointer.
                          },
   restriction     [2] IMPLICIT InternationalString OPTIONAL}

HitVector ::= SEQUENCE{ 
                      -- Each hit vector points to a fragment within the
                      -- element, via location and/or token.
   satisfier                 Term OPTIONAL, -- sourceword, etc.
   offsetIntoElement  [1]    IMPLICIT IntUnit OPTIONAL,
   length             [2]    IMPLICIT IntUnit OPTIONAL,
   hitRank            [3]    IMPLICIT INTEGER OPTIONAL,
   targetToken        [4]    IMPLICIT OCTET STRING OPTIONAL
                                -- Origin may use token subsequently within a
                                -- variantRequest (in an elementRequest) to
                                -- retrieve (or to refer to) the fragment.  
                     }


Variant ::= SEQUENCE{
     globalVariantSetId   [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
                                -- Applies to the triples below, when
                                -- variantSetId omitted. If
                                -- globalVariantSetId omitted, default applies.
                                -- Default may be provided by the tagSet-M
                                -- element defaultVariantSetId.
   triples                [2] IMPLICIT SEQUENCE OF SEQUENCE{
                                variantSetId    [0]   IMPLICIT OBJECT IDENTIFIER
                                                        OPTIONAL,
                                                       -- If omitted,
                                                       -- globalVariantSetId
                                                       -- (above) applies, unless
                                                       -- that too is omitted, in
                                                       -- which case, default
                                                       -- used.
                                class           [1]    IMPLICIT INTEGER,
                                type            [2]    IMPLICIT INTEGER,
                                value           [3]    CHOICE{
                                                          INTEGER,
                                                         InternationalString,
                                                          OCTET STRING,
                                                          OBJECT IDENTIFIER,
                                                          BOOLEAN,
                                                          NULL,
                                       -- Following need context tags:
                                          unit                [1] IMPLICIT Unit, 
                                          valueAndUnit        [2] IMPLICIT
                                                                     IntUnit}}}
END





RecordSyntax-ESTaskPackage
{Z39-50-recordSyntax ESTaskPackage (106)} DEFINITIONS ::=
BEGIN 
IMPORTS Permissions, InternationalString, IntUnit, DiagRec 
FROM Z39-50-APDU-1995;

TaskPackage ::= SEQUENCE{
   packageType               [1]   IMPLICIT OBJECT IDENTIFIER,
                                        -- oid of specific ES definition
   packageName               [2]   IMPLICIT InternationalString OPTIONAL,
   userId                    [3]   IMPLICIT InternationalString OPTIONAL,
   retentionTime             [4]   IMPLICIT IntUnit OPTIONAL,
   permissions               [5]   IMPLICIT Permissions OPTIONAL,
   description               [6]   IMPLICIT InternationalString OPTIONAL,
   targetReference           [7]   IMPLICIT OCTET STRING OPTIONAL,
   creationDateTime          [8]   IMPLICIT GeneralizedTime OPTIONAL,
   taskStatus                [9]   IMPLICIT INTEGER{
                                       pending  (0),
                                       active   (1),
                                       complete (2),
                                       aborted  (3)},
   packageDiagnostics        [10]  IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
   taskSpecificParameters    [11]  IMPLICIT EXTERNAL
                                       -- Use oid for specific ES definition
                                       -- (same oid as packageType above)
                                       -- and select [2] "taskPackage."
      } 
END





ResourceReport-Format-Resource-1
{Z39-50-resourceReport resource-1 (1)} DEFINITIONS ::=
BEGIN 
IMPORTS InternationalString FROM Z39-50-APDU-1995;  
--
ResourceReport ::= SEQUENCE{
estimates    [1] IMPLICIT SEQUENCE OF Estimate,
message      [2] IMPLICITInternationalString}
--
Estimate ::= SEQUENCE{
type            [1] IMPLICIT EstimateType,
value           [2] IMPLICIT INTEGER,  -- the actual estimate
currency-code   [3] IMPLICIT INTEGER OPTIONAL
                      -- code for representation of currencies defined in ISO
                      -- 4217-1990.  Applicable only to monetary estimates.
                                             }
EstimateType ::= INTEGER{
currentSearchRecords      (1),  -- estimated no. records in current
                                -- (incomplete) result set for search
finalSearchRecords        (2),  -- estimated no. records that will be in result
                                -- set if search completes
currentPresentRecords     (3),  -- estimated number of records in current
                                -- (incomplete) set of records to be returned
                                -- on Present
finalPresentRecords       (4),  -- estimated number of records that will be in
                                -- the set of records to be returned by Present
                                -- if Present completes
currentOpTimeProcessing   (5),  -- processing time (in .001 CPU seconds) used
                                -- by operation so far 
finalOpTimeProcessing     (6),  -- estimated total processing time (in .001 CPU
                                -- seconds) that will be used by this operation
                                -- if it completes
currentAssocTime          (7),  -- estimated processing time used by
                                -- association (in .001 CPU sec.)
currentOperationCost      (8),  -- estimated cost for this operation so far
finalOperationCost        (9),  -- estimated cost for this operation if it
                                -- completes
currentAssocCost          (10), -- estimated cost for this association so far
finalOpTimeElapsed        (11), -- estimated elapsed time for operation if it
                                -- completes (in .001 sec.) 
percentComplete           (12), -- estimated percent complete
currentSearchAssocCost    (13), -- estimated search cost for association so far
currentPresentAssocCost   (14), -- estimated present cost for this association
                                -- so far
currentConnectAssocCost   (15), -- estimated connect time cost for association
                                -- so far
currentOtherAssocCost     (16)  -- estimated other cost (not included in 13-15)
                                -- for association so far
                           }
END





ResourceReport-Format-Resource-2
{Z39-50-resourceReport resource-2 (2)} DEFINITIONS ::=
BEGIN 
IMPORTS InternationalString, StringOrNumeric, IntUnit FROM
Z39-50-APDU-1995; 
--
ResourceReport ::= SEQUENCE{
estimates    [1] IMPLICIT SEQUENCE OF Estimate OPTIONAL,
message      [2] IMPLICITInternationalString OPTIONAL}
--
Estimate ::= SEQUENCE{
type     [1] StringOrNumeric,
                -- Numeric values of 1-16 are the same as used in Resource-1.
value    [2] IMPLICIT IntUnit
               -- When expressing currency:
               --      unitSystem (of Unit) is 'z3950' (case insensitive)
               --      unitType is 'iso4217-1990' (case insensitive)
               --      unit is currency code from ISO 4217-1990.
}
END





AccessControlFormat-prompt-1
{Z39-50-accessControl prompt-1 (1)} DEFINITIONS ::=
BEGIN
IMPORTS InternationalString, DiagRec FROM Z39-50-APDU-1995;
--
PromptObject ::= CHOICE{
   challenge    [1] IMPLICIT Challenge,
   response     [2] IMPLICIT Response}

  Challenge ::= SEQUENCE OF SEQUENCE {
      promptId         [1] PromptId,
                             -- Target supplies a number (for an enumerated
                             -- prompt) or string (for a non-enumerated
                             -- prompt), for each prompt, and the origin
                             -- returns it in response, for this prompt, so
                             -- target may correlate the prompt response with
                             -- the prompt.
   defaultResponse    [2] IMPLICIT InternationalString OPTIONAL,
   promptInfo         [3] CHOICE{ 
                              character   [1] IMPLICIT InternationalString,
                              encrypted   [2] IMPLICIT Encryption} OPTIONAL,
                                   -- Information corresponding to an
                                   -- emumerated prompt. For example if 'type',
                                   -- within PromptId, is 'copyright', then
                                   -- promptInfo may contain a copyright
                                   -- statement.  
   regExpr            [4] IMPLICIT InternationalString OPTIONAL,
                             -- A regular expression that promptResponse should
                             -- match. See IEEE 1003.2 Volume 1, Section 2.8
                             -- "Regular Expression Notation." For example if
                             -- promptId is "Year of publication," regExpr
                             -- might be "19[89][0-9]|20[0-9][0-9]".
   responseRequired   [5] IMPLICIT NULL OPTIONAL,
   allowedValues      [6] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
                             -- e.g. promptId="Desired color"; allowed = 'red',
                             -- 'blue','Green'.
   shouldSave         [7] IMPLICIT NULL OPTIONAL,
                             -- Target recommends that origin save the data
                             -- that it prompts from the user corresponding to
                             -- this prompt, because it is likely to be
                             -- requested again (so origin might not have to
                             -- prompt the user next time).
   dataType           [8] IMPLICIT INTEGER{
                                integer         (1),
                                date            (2),
                                float           (3),
                                alphaNumeric    (4),
                                url-urn         (5),
                                boolean         (6)} OPTIONAL,
                                   -- Target telling origin type of data it
                                   -- wants. E.g., if "date" is specified,
                                   -- presumably the origin will try to prompt
                                   -- something "date-like" from the user.
   diagnostic      [9] IMPLICIT EXTERNAL OPTIONAL
                          -- Intended for repeat requests when there is an
                          -- error the origin should report to the user from
                          -- previous attempt.
                        }


  Response ::= SEQUENCE OF SEQUENCE {
        promptId      [1] PromptId,
                             -- Corresponds to a prompt in the challenge, or
                             -- may be unprompted, for example "newPassword."
                             -- If unprompted, should be "enumerated." 
                             -- If this responds to a non-enumerated prompt,
                             -- then nonEnumeratedPrompt should contain the
                             -- prompt string from the challenge.
      promptResponse  [2] CHOICE{
                             string       [1] IMPLICIT InternationalString,
                             accept       [2] IMPLICIT BOOLEAN,
                             acknowledge  [3] IMPLICIT NULL,
                             diagnostic   [4] DiagRec,
                             encrypted    [5] IMPLICIT Encryption}}


 PromptId ::= CHOICE{
   enummeratedPrompt      [1] IMPLICIT SEQUENCE{
                                 type                  [1] IMPLICIT INTEGER{
                                                                 groupId      (0),
                                                                 userId       (1),
                                                                 password     (2),
                                                                 newPassword  (3),
                                                                 copyright    (4),
                                          -- When type on Challenge is
                                          -- 'copyright', promptInfo has text of
                                          -- copyright message to be displayed
                                          -- verbatim to the user. If
                                          -- promptResponse indicates
                                          -- 'acceptance', this indicates the
                                          -- user has been shown, and accepted,
                                          -- the terms of the copyright. This is
                                          -- not intended to be legally binding,
                                          -- but provides a good-faith attempt
                                          -- on the part of the target to inform
                                          -- the user of the copyright.
                                                                 sessionId    (5)},
                                 suggestedString       [2] IMPLICIT
                                             InternationalString OPTIONAL},
    nonEnumeratedPrompt   [2] IMPLICIT InternationalString}


 Encryption ::= SEQUENCE{
   cryptType    [1] IMPLICIT OCTET STRING OPTIONAL, 
   credential   [2] IMPLICIT OCTET STRING OPTIONAL,
                      --random number, SALT, or other factor
   data         [3] IMPLICIT OCTET STRING}

END





AccessControlFormat-des-1
{Z39-50-accessControlFormat  des-1 (2)} DEFINITIONS ::=
BEGIN
      DES-RN-Object ::= CHOICE {
         challenge        [1] IMPLICIT DRNType,
         response         [2] IMPLICIT DRNType}

      DRNType ::= SEQUENCE{
         userId           [1] IMPLICIT OCTET STRING OPTIONAL,
         salt             [2] IMPLICIT OCTET STRING OPTIONAL,
         randomNumber     [3] IMPLICIT OCTET STRING}
END





AccessControlFormat-krb-1
{Z39-50-accessControlFormat  krb-1 (3)} DEFINITIONS ::=
BEGIN
IMPORTS InternationalString FROM Z39-50-APDU-1995;

   KRBObject ::= CHOICE {
      challenge    [1] IMPLICIT KRBRequest,
      response     [2] IMPLICIT KRBResponse}

   KRBRequest ::= SEQUENCE{
      service      [1] IMPLICIT InternationalString,      
      instance     [2] IMPLICIT InternationalString OPTIONAL,
      realm        [3] IMPLICIT InternationalString OPTIONAL
                          -- target requests a ticket for the given service,
                          -- instance, and realm
                      }

   KRBResponse ::= SEQUENCE{
      userid       [1] IMPLICIT InternationalString OPTIONAL,
      ticket       [2] IMPLICIT OCTET STRING
                          -- origin responds with a ticket for the requested
                          -- service
                      }
END






ESFormat-PersistentResultSet
{Z39-50-extendedService PersistentResultSet (1)} DEFINITIONS ::=
BEGIN
IMPORTS InternationalString FROM Z39-50-APDU-1995;
PersistentResultSet ::= CHOICE{
    esRequest      [1] IMPLICIT SEQUENCE{
                          toKeep       [1] IMPLICIT NULL,
                          notToKeep    [2] OriginPartNotToKeep OPTIONAL},
    taskPackage   [2] IMPLICIT SEQUENCE{
                          originPart   [1] IMPLICIT NULL,
                          targetPart   [2] TargetPart OPTIONAL}}

OriginPartNotToKeep ::= SEQUENCE{
   originSuppliedResultSet   [1] IMPLICIT InternationalString OPTIONAL,
                                   -- name of transient result set, supplied on
                                   -- request, mandatory unless function is
'delete'
   replaceOrAppend           [2] IMPLICIT INTEGER{  
                                       -- only if function is "modify"
                                   replace   (1),
                                   append    (2)} OPTIONAL}

TargetPart ::= SEQUENCE{
   targetSuppliedResultSet   [1] IMPLICIT InternationalString OPTIONAL, 
                                   -- Name of transient result set, supplied by
                                   -- target, representing the persistent
                                   -- result set to which package pertains.
                                   -- Meaningful only when package is
                                   -- presented. (i.e. not on ES response)
   numberOfRecords           [2] IMPLICIT INTEGER OPTIONAL}
END





ESFormat-PersistentQuery
{Z39-50-extendedService PersistentQuery (2)} DEFINITIONS ::=
BEGIN
IMPORTS Query, InternationalString, OtherInformation FROM Z39-50-APDU-1995;
PersistentQuery ::= CHOICE{
    esRequest      [1] IMPLICIT SEQUENCE{
                          toKeep       [1] OriginPartToKeep OPTIONAL,
                          notToKeep    [2] OriginPartNotToKeep},
    taskPackage    [2] IMPLICIT SEQUENCE{
                          originPart   [1] OriginPartToKeep OPTIONAL,
                          targetPart   [2] TargetPart}}

OriginPartToKeep ::= SEQUENCE{
   dbNames                [2] IMPLICIT SEQUENCE OF InternationalString
                                           OPTIONAL,
   additionalSearchInfo   [3] OtherInformation OPTIONAL}

OriginPartNotToKeep ::= CHOICE{
   package                [1] IMPLICIT InternationalString,
   query                  [2] Query}

TargetPart ::= Query  

END





ESFormat-PeriodicQuerySchedule
{Z39-50-extendedService PeriodicQuerySchedule (3)} DEFINITIONS ::=
BEGIN
IMPORTS Query, InternationalString, IntUnit FROM Z39-50-APDU-1995 
ExportSpecification, Destination FROM ESFormat-ExportSpecification;

PeriodicQuerySchedule ::= CHOICE{
    esRequest      [1] IMPLICIT SEQUENCE{
                          toKeep       [1] OriginPartToKeep,
                          notToKeep    [2] OriginPartNotToKeep},
    taskPackage    [2] IMPLICIT SEQUENCE{
                          originPart   [1] OriginPartToKeep,
                          targetPart   [2] TargetPart}}

OriginPartToKeep ::=SEQUENCE{
   activeFlag             [1] IMPLICIT BOOLEAN,
   databaseNames          [2] IMPLICIT SEQUENCE OF InternationalString
                                 OPTIONAL,
   resultSetDisposition   [3] IMPLICIT INTEGER{
                                 replace     (1),
                                 append      (2),
                                createNew    (3)   
                                -- Only if origin and target have agreement
                                -- about naming convention for the resulting
                                -- package, and only if no resut set is
                                -- specified.
                             } OPTIONAL,    
                                -- Mandatory on 'create' if result set is
                                -- specified, in which case it must be
                                -- 'replace' or 'append.
   alertDestination       [4] Destination OPTIONAL,
   exportParameters       [5] CHOICE{
                                packageName     [1] IMPLICIT
                                                    InternationalString,
                                exportPackage   [2] ExportSpecification}
                                    OPTIONAL}

OriginPartNotToKeep ::= SEQUENCE{
   querySpec                 [1] CHOICE{
                                 actualQuery    [1] Query,
                                   packageName  [2] IMPLICIT
                                       InternationalString} OPTIONAL,
                                -- mandatory for 'create'
   originSuggestedPeriod     [2] Period OPTIONAL,  -- mandatory for 'create'
   expiration                [3] IMPLICIT GeneralizedTime OPTIONAL,
   resultSetPackage          [4] IMPLICIT InternationalString OPTIONAL}

TargetPart ::= SEQUENCE{
   actualQuery            [1] Query,
   targetStatedPeriod     [2] Period,
                                -- Target supplies the period, which may be
                                -- same as origin proposed.
   expiration             [3] IMPLICIT GeneralizedTime OPTIONAL,
                                -- Target supplies value for task package. It
                                -- may be the same as origin proposed or
                                -- different from (and overrides) origin
                                -- proposal, but if omitted, there is no
                                -- expiration.
   resultSetPackage       [4] IMPLICIT InternationalString OPTIONAL,
                                -- May be omitted only if exportParameters was
                                -- supplied. Target supplies same name as
                                -- origin supplied, if origin did supply a
                                -- name.
   lastQueryTime          [5] IMPLICIT GeneralizedTime,
   lastResultNumber       [6] IMPLICIT INTEGER,
   numberSinceModify      [7] IMPLICIT INTEGER OPTIONAL}

   Period ::= CHOICE{
                unit            [1] IMPLICIT IntUnit,
                businessDaily   [2] IMPLICIT NULL,
                continuous      [3] IMPLICIT NULL,
                other           [4] IMPLICIT InternationalString}
END





ESFormat-ItemOrder
{Z39-50-extendedService ItemOrder (4)} DEFINITIONS ::=
BEGIN
IMPORTS InternationalString FROM Z39-50-APDU-1995;

ItemOrder ::= CHOICE{
    esRequest      [1] IMPLICIT SEQUENCE{
                          toKeep       [1] OriginPartToKeep OPTIONAL,
                          notToKeep    [2] OriginPartNotToKeep},
    taskPackage    [2] IMPLICIT SEQUENCE{
                          originPart   [1] OriginPartToKeep OPTIONAL,
                          targetPart   [2] TargetPart}}

OriginPartToKeep ::= SEQUENCE{
   supplDescription   [1] IMPLICIT EXTERNAL OPTIONAL,
   contact            [2] IMPLICIT SEQUENCE{
                             name  [1]   IMPLICIT InternationalString OPTIONAL,
                             phone [2]   IMPLICIT InternationalString OPTIONAL,
                             email [3]   IMPLICIT InternationalString OPTIONAL}
                                                     OPTIONAL,
   addlBilling        [3] IMPLICIT SEQUENCE{
                          paymentMethod      [1] CHOICE{
                                billInvoice                   [0] IMPLICIT NULL,
                                prepay                        [1] IMPLICIT NULL,
                                depositAccount                [2] IMPLICIT NULL,
                                creditCard                    [3] IMPLICIT 
                                                                 CreditCardInfo,
                                cardInfoPreviouslySupplied    [4] IMPLICIT NULL,
                                privateKnown                  [5] IMPLICIT NULL,
                                privateNotKnown               [6] IMPLICIT
                                                                  EXTERNAL},
                          customerReference  [2] IMPLICITInternationalString
                                                           OPTIONAL,
                          customerPONumber   [3] IMPLICITInternationalString
                                                     OPTIONAL}  OPTIONAL}

CreditCardInfo    ::= SEQUENCE{
      nameOnCard          [1] IMPLICIT InternationalString,
      expirationDate      [2] IMPLICIT InternationalString,
      cardNumber          [3] IMPLICIT InternationalString} 

OriginPartNotToKeep ::= SEQUENCE{ 
                          -- Corresponds to 'requestedItem' in service
                          -- definition. Must supply at least one, and may
                          -- supply both.
   resultSetItem   [1]    IMPLICIT SEQUENCE{  
                             resultSetId  [1] IMPLICIT InternationalString,
                           item           [2] IMPLICIT INTEGER} OPTIONAL,
   itemRequest     [2] IMPLICIT EXTERNAL OPTIONAL
                          -- When itemRequest is an ILL-Request APDU, 
                          -- use OID {iso standard 10161 abstract-syntax (2)
                          -- ill-apdus (1)}
                     }

TargetPart ::= SEQUENCE{
   itemRequest            [1] IMPLICIT EXTERNAL OPTIONAL,
                                -- When itemRequest is an ILL-Request APDU, use
                                -- OID 1.0.10161.2.1 (as above)
   statusOrErrorReport    [2] IMPLICIT EXTERNAL,
                                -- When statusOrErrorReport is an ILL
                                -- Status-Or-Error-Report APDU, use OID 
                                -- 1.0.10161.2.1 (as above)
   auxiliaryStatus        [3] IMPLICIT INTEGER{
                                   notReceived         (1),
                                   loanQueue           (2),
                                   forwarded           (3),
                                   unfilledCopyright   (4),
                                   filledCopyright     (5)} OPTIONAL}
END





ESFormat-Update
{Z39-50-extendedService Update (5)} DEFINITIONS ::=
BEGIN
IMPORTS DiagRec, InternationalString FROM Z39-50-APDU-1995; 

Update ::= CHOICE{
    esRequest      [1] IMPLICIT SEQUENCE{
                          toKeep       [1] OriginPartToKeep,
                          notToKeep    [2] OriginPartNotToKeep},
    taskPackage    [2] IMPLICIT SEQUENCE{
                          originPart   [1] OriginPartToKeep,
                          targetPart   [2] TargetPart}}

OriginPartToKeep ::= SEQUENCE{
   action          [1] IMPLICIT INTEGER{
                          recordInsert    (1),
                          recordReplace   (2),
                          recordDelete    (3),
                          elementUpdate   (4)},
   databaseName    [2] IMPLICIT InternationalString,
   schema          [3] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
   elementSetName  [4] IMPLICIT InternationalString OPTIONAL}

OriginPartNotToKeep ::= SuppliedRecords

TargetPart ::= SEQUENCE{
   updateStatus           [1] IMPLICIT INTEGER{
                                success   (1),
                                partial   (2),
                                failure   (3)},
   globalDiagnostics      [2] IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
                                -- These are non-surrogate diagnostics relating
                                -- to the task, not to individual records.  
   taskPackageRecords     [3] IMPLICIT SEQUENCE OF TaskPackageRecordStructure
                                -- There should be a TaskPackageRecordStructure
                                -- for every record supplied. The target should
                                -- create such a structure for every record
                                -- immediately upon creating the task package
                                -- to include correlation information and
                                -- status. The record itself would not be
                                -- included until processing for that record is
                                -- complete.
                  }

-- Auxiliary definitions for Update
SuppliedRecords ::= SEQUENCE OF SEQUENCE{
   recordId           [1] CHOICE{
                             number   [1] IMPLICIT INTEGER,
                             string   [2] IMPLICIT InternationalString,
                             opaque   [3] IMPLICIT OCTET STRING} OPTIONAL,
   supplementalId     [2] CHOICE{
                             timeStamp          [1] IMPLICIT GeneralizedTime,
                             versionNumber      [2] IMPLICIT
                                                    InternationalString,
                             previousVersion    [3] IMPLICIT EXTERNAL} OPTIONAL,
   correlationInfo    [3] IMPLICIT CorrelationInfo OPTIONAL,
   record             [4] IMPLICIT EXTERNAL}

CorrelationInfo ::= SEQUENCE{
                     -- origin may supply one or both for any record:
   note  [1] IMPLICIT InternationalString OPTIONAL,
   id    [2] IMPLICIT INTEGER OPTIONAL}

TaskPackageRecordStructure ::= SEQUENCE{
      recordOrSurDiag     [1] CHOICE {
                                record      [1] IMPLICIT EXTERNAL,
                                                -- Choose 'record' if
                                                -- recordStatus is 'success',
                                                -- and elementSetName was
                                                -- supplied.
                                diagnostic   [2] DiagRec
                                                -- Choose 'diagnostic', if
                                                -- RecordStatus is failure.
                                                } OPTIONAL,
                                -- The parameter recordOrSurDiag will thus be
                                -- omitted only if 'elementSetName' was omitted
                                -- and recordStatus is 'success'; or if record
                                -- status is 'queued' or in 'process'.
      correlationInfo     [2] IMPLICIT CorrelationInfo OPTIONAL,
                                -- This should be included if it was supplied
                                -- by the origin.
      recordStatus        [3] IMPLICIT INTEGER{
                                   success      (1),
                                   queued       (2),
                                   inProcess    (3),
                                   failure      (4)}}
END


ESFormat-ExportSpecification
{Z39-50-extendedService ExportSpecification (6)} DEFINITIONS ::=
BEGIN
EXPORTS ExportSpecification, Destination; IMPORTS CompSpec,
InternationalString FROM Z39-50-APDU-1995;

ExportSpecification ::= CHOICE{
    esRequest      [1] IMPLICIT SEQUENCE{
                          toKeep       [1] OriginPartToKeep,
                          notToKeep    [2] IMPLICIT NULL},
    taskPackage    [2] IMPLICIT SEQUENCE{
                          originPart   [1] OriginPartToKeep,
                          targetPart   [2] IMPLICIT NULL}}

OriginPartToKeep ::= SEQUENCE{
   composition        [1] IMPLICIT CompSpec,
   exportDestination  [2] Destination}

  Destination ::= CHOICE{
   phoneNumber     [1]    IMPLICIT InternationalString,
   faxNumber       [2]    IMPLICIT InternationalString,
   x400address     [3]    IMPLICIT InternationalString,
   emailAddress    [4]    IMPLICIT InternationalString,
   pagerNumber     [5]    IMPLICIT InternationalString,
   ftpAddress      [6]    IMPLICIT InternationalString,
   ftamAddress     [7]    IMPLICIT InternationalString,
   printerAddress  [8]    IMPLICIT InternationalString,
   other           [100]  IMPLICIT SEQUENCE{
                             vehicle      [1] IMPLICIT InternationalString 
                                                     OPTIONAL,
                           destination    [2] IMPLICIT InternationalString}}
END





ESFormat-ExportInvocation
{Z39-50-extendedService ExportInvocation (7)} DEFINITIONS ::=
BEGIN
IMPORTS InternationalString, IntUnit FROM Z39-50-APDU-1995 
ExportSpecification FROM ESFormat-ExportSpecification;

ExportInvocation ::= CHOICE{
    esRequest      [1] IMPLICIT SEQUENCE{
                          toKeep      [1] OriginPartToKeep,
                          notToKeep   [2] OriginPartNotToKeep},
    taskPackage    [2] IMPLICIT SEQUENCE{
                          originPart   [1] OriginPartToKeep,
                          targetPart   [2] TargetPart OPTIONAL}}

OriginPartToKeep ::= SEQUENCE{
   exportSpec      [1] CHOICE{
                          packageName  [1] IMPLICIT InternationalString,
                          packageSpec  [2] ExportSpecification},
   numberOfCopies  [2] IMPLICIT INTEGER}

OriginPartNotToKeep   ::= SEQUENCE{
   resultSetId     [1] IMPLICIT InternationalString,
   records         [2] CHOICE{
                          all      [1] IMPLICIT NULL,
                          ranges   [2] IMPLICIT SEQUENCE OF SEQUENCE{
                                          start   [1] IMPLICIT INTEGER,
                                          count   [2] IMPLICIT INTEGER OPTIONAL
                                             -- Count may be omitted only on
                                             -- last range, to indicate "all
                                             -- remaining records beginning with
                                             -- 'start'."
                              }}}

TargetPart    ::= SEQUENCE{
      estimatedQuantity   [1] IMPLICIT IntUnit OPTIONAL,
      quantitySoFar       [2] IMPLICIT IntUnit OPTIONAL,
      estimatedCost       [3] IMPLICIT IntUnit OPTIONAL,
      costSoFar           [4] IMPLICIT IntUnit OPTIONAL}
END





UserInfoFormat-searchResult-1
{Z39-50-userInfoFormat searchResult-1 (1)} DEFINITIONS ::=
BEGIN
IMPORTS DatabaseName, Term, Query, IntUnit, InternationalString 
FROM Z39-50-APDU-1995;

SearchInfoReport ::= SEQUENCE OF SEQUENCE{
   subqueryId                [1] IMPLICIT InternationalString OPTIONAL, 
                                   -- shorthand identifier of subquery
   fullQuery                 [2] IMPLICIT BOOLEAN,       
                                   -- 'true' means this is the full query;
                                   -- 'false', a sub-query 
   subqueryExpression        [3] QueryExpression OPTIONAL,   
                                   -- A subquery of the query as submitted. May
                                   -- be whole query; if so, "fullQuery" should
                                   -- be 'true'.
   subqueryInterpretation    [4] QueryExpression OPTIONAL,   
                                   -- how target interpreted subquery
   subqueryRecommendation    [5] QueryExpression OPTIONAL,   
                                   -- target-recommended alternative
   subqueryCount             [6] IMPLICIT INTEGER OPTIONAL,   
                                   -- Number of records for this subQuery,
                                   -- across all of the specified databases.
                                   -- (If during search, via resource control,
                                   -- number of records so far).
   subqueryWeight            [7] IMPLICIT IntUnit OPTIONAL,   
                                   -- relative weight of this subquery
   resultsByDB               [8] IMPLICIT ResultsByDB OPTIONAL}

ResultsByDB ::= SEQUENCE OF SEQUENCE{
   databases       [1] CHOICE{
                          all   [1] IMPLICIT NULL,
                                       -- applies across all of the databases in
                                       -- Search PDU
                          list  [2] IMPLICIT SEQUENCE OF DatabaseName
                                       -- applies across all databases in this
                                       -- list
                             },
   count           [2] IMPLICIT INTEGER OPTIONAL,
                          -- Number of records for query component (and, as
                          -- above, if during search, via resource control,
                          -- number of records so far).
   resultSetName   [3] IMPLICIT InternationalString OPTIONAL
                          -- Target-assigned result set by which subQuery is
                          -- available. Should not be provided unless
                          -- processing for this query component is concluded
                          -- (i.e., when this report comes during search, via
                          -- resource control, as opposed to after search, via
                          -- additionalSearchInfo).
                     }

QueryExpression ::=  CHOICE {
      term   [1] IMPLICIT SEQUENCE{
                   queryTerm    [1] Term,
                   termComment  [2] IMPLICIT InternationalString OPTIONAL},
      query  [2] Query}
END





{Z39-50-elementSpec eSpec-1 (1)} DEFINITIONS ::=
BEGIN
IMPORTS Variant FROM RecordSyntax-generic
StringOrNumeric, InternationalString FROM Z39-50-APDU-1995;
--
Espec-1 ::= SEQUENCE{
   elementSetNames           [1] IMPLICIT SEQUENCE OF InternationalString
                                           OPTIONAL,
                                   -- Origin may include one or more element
                                   -- set names, each specifying a set of
                                   -- elements. Each of the elements is to be
                                   -- treated as an elementRequest in the form
                                   -- of simpleElement, where occurrence is 1. 
   defaultVariantSetId       [2] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
                                   -- If supplied, applies whenever
                                   -- variantRequest does not include
                                   -- variantSetId. 
   defaultVariantRequest     [3] IMPLICIT Variant OPTIONAL,
                                   -- If supplied, then for each simple
                                   -- elementRequest that does not include a
                                   -- variantRequest, the defaultVariantRequest
                                   -- applies. (defaultVariantRequest does not
                                   -- apply to a compositeRequest.)
   defaultTagType            [4] IMPLICIT INTEGER OPTIONAL,
                                   -- If supplied, applies whenever 'tagType'
                                   -- (within 'tag' within TagPath) is omitted.
   elements                  [5] IMPLICIT SEQUENCE OF ElementRequest OPTIONAL}
--

ElementRequest::= CHOICE{
   simpleElement      [1] IMPLICIT SimpleElement,
   compositeElement   [2] IMPLICIT SEQUENCE{
                             elementList  [1] CHOICE{
                                             primitives   [1] IMPLICIT SEQUENCE
                                                        OF InternationalString,
                                                -- Origin may specify one or
                                                -- more element set names, each
                                                -- identifying a set of
                                                -- elements, and the composite
                                                -- element is the union.
                                             specs         [2] IMPLICIT SEQUENCE
                                                               OF SimpleElement},
                  deliveryTag             [2] IMPLICIT TagPath,
                                             -- DeliveryTag tagPath for
                                             -- compositeElement may not
                                             -- include wildThing or wildPath.
                  variantRequest          [3] IMPLICIT Variant OPTIONAL}}

SimpleElement ::= SEQUENCE{
      path            [1] IMPLICIT TagPath,
      variantRequest  [2] IMPLICIT Variant OPTIONAL}
   

TagPath ::= SEQUENCE OF CHOICE{  
   specificTag  [1] IMPLICIT SEQUENCE{
                      tagType   [1] IMPLICIT INTEGER OPTIONAL,
                                       -- If omitted, then 'defaultTagType'
                                       -- (above) applies, if supplied, and
                                       -- if not supplied, then default listed
                                       -- in schema applies.
                  tagValue      [2] StringOrNumeric,
                   occurrence   [3] Occurrences OPTIONAL 
                                       -- default is "first occurrence"
                           },
   wildThing    [2] Occurrences,
                      -- Get Nth "thing" at this level, regardless of tag, for
                      -- each N specified by "Occurrences" (which may be 'all'
                      -- meaning match every element at this level). E.g., if
                      -- "Occurrences" is 3, get third element regardless of
                      -- its tag or the tag of the first two elements.
   wildPath     [3] IMPLICIT NULL
                      -- Match any tag, at this level or below, that is on a
                      -- path for which next tag in this TagPath sequence
                      -- occurs. WildPath may not be last member of the
                      -- TagPath sequence.
                                 }
--
Occurrences ::= CHOICE{
   all       [1] IMPLICIT NULL,
   last      [2] IMPLICIT NULL,
   values    [3] IMPLICIT SEQUENCE{
                   start     [1] IMPLICIT INTEGER,
                                   -- if 'start' alone is included, then single
                                   -- occurrence is requested
                   howMany   [2] IMPLICIT INTEGER OPTIONAL
                                   -- For example, if 'start' is 5 and
                                   -- 'howMany' is 6, then request is for
                                   -- "occurrences 5 through 10."
                           }}
END