CMB13 OCT 157777
CMB14 OCT 137777
CMB45 OCT 177717
COUNT DEC 0 
DM16  DEC -16 
D16   EQU BIT4
DM15  DEC -15 
DM17  DEC -17 
DM21  DEC -21 
M5SEC DEC -50       = 4.9 TO 5.0 SECONDS. 
B40   EQU BIT5
B60   OCT 60
LASM1 NOP           LAST MAIN TO INT FOR MUX # 1. 
LASM2 NOP           LAST MAIN TO INT. FOR MUX. # 2. 
TIMAD DEF TIMRT     ADDR OF TIMEOUT SUBR. 
PHYBF DEF EQT26     ADDR OF PHYSICAL TIMEOUT BFR. 
SBITP DEF *+1       STOP BITS POINTER 
      OCT 43600     TTY(ASCII)(ODD OR NO PARITY.) 
      OCT 43400     TTY WITH EVEN PARITY. 
NULCP DEF *+1       NULL CHAR ADDR
      OCT 47777     TIME DELAY CHAR FOR NO PARITY.
      OCT 47577     TIME DELAY CHAR WITH PARITY.
TPARI OCT 160000
RPARI OCT 120000
RTADD NOP           RETURN ADDR 
SAVSC NOP 
SAVEX NOP 
UNITM OCT 3700
UNIM1 OCT 1700
IPDMY OCT 101202    TURN OFF THIS INPUT CHNL. 
OPDMY OCT 101202    TURN OFF THIS OUTPUT DATA CHNL. 
UNIT  NOP           CURRENT UNIT #
DUNIT NOP          CURRENT UNIT # RT. JUSTIFIED.
SPTBP DEF *+1 
      OCT 0         N/A OR DEFAULT TO DEVICE TYP SPD
      OCT 1202      110 BPS (11 BIT/CHAR) 
      OCT 157       134.5 BPS (2741-9 BITS/CHAR)
      OCT 537       150 BPS (10 BITS/CHAR)
      OCT 1100      220 BPS (11 BITS/CHAR)
      OCT 457       300 BPS (10 BITS/CHAR)
      OCT 1040      440 BPS (11 BITS/CHAR)
      OCT 427       600 BPS (10 BITS/CHAR)
      OCT 1017      880 BPS (11 BITS/CHAR)
      OCT 413       1200 BPS (10 BITS/CHAR) 
      OCT 1007      1760 BPS (11 BITS/CHAR) 
S2400 OCT 405       2400 BPS (10 BITS/CHAR) 
      OCT 403       4800 BPS (10 BITS/CHAR) 
      SPC 2 
UNEQP DEF UNEQT     POINTS TO EQT POINTER TABLE.
UNEQA EQU UNEQP 
SPTAD EQU SPTBP 
SWREX EQU SRWEX 
UNEQT EQU * 
      REP 32
      NOP           POINTER TO EQT[SUB SC(SUB UNIT#)] 
      SPC 2 
      NOP 
SCDCA OCT 140374    RAISE CD & CA (ECHOPLEX-103) -
*                                   ALSO FOR HALF DUPLEX SEND (202).
SSAB  OCT 140114    LOWER SA FOR HALF DUPLEX SEND.
SCDAB OCT 140334    RAISE CD & LOWER CA - 202 RECEIVE.
SSA   OCT 140136    RAISE SA FOR 202 RECEIVE. 
SCDAS OCT 140365    SUPPRESS CF INTERRUPTS. 
SCDBS OCT 140100    LOWER CD & INHIBIT ALL INTERRUPTS.
SCDAF OCT 140327    RAISE CD & LOWER CA WHILE INHIBIT 
*                                    ING CF STATUS CHANGE INTERRUPTS. 
SCDAX OCT 140337
SSAX  OCT 140135
SSAF  OCT 140132    RAISE SA WHILEINHIBITING SB INT.
SSAFB OCT 140120    RAISE SA & INHIBIT SB&CB INTERUPTS. 
*                                     CHANGE INTERRUPTS.
      HED ASYNC MUX UTILITY SUBROUTINES.
*  SETP SETS POINTERS TO CURRENT ENTRY PLUS ITS EXTENTION 
* 
*         CALLING SEQUENCE: LDB ADEQT   ADDR OF CURRENT EQT ENTRY 
*                           JSB SETP
      SPC 1 
SETP  EQU * 
      NOP 
* MAY BE ENTERED MORE THAN ONCE PER INTERRUPT. FIND A WAY 
*  REDUCE THE NUMBER OF ENTRIES PER INTERRUPT.
      STB PQT1
      ADB D2
      STB PQT3
      INB 
      STB PQT4
      INB 
      STB PQT5
      INB 
      STB PQT6
      ADB D2
      STB PQT8
      INB 
      STB PQT9
      INB 
      STB PQT10 
      ADB D5
      STB PQT15 
      INB 
      STB PQT16 
      INB 
      STB PQT17 
      LDA B,I 
      INA 
      STA EQT19 
      ADA D2
      STA EQT21 
      INA 
      STA EQT22 
      INA 
      STA EQT23 
      INA 
      STA EQT24 
      INA 
      STA EQT25 
      INA 
      STA EQT26 
      INA 
      STA EQT27 
      ADA D3
      STA EQT30 
      INA 
      STA EQT31 
      ADA D3
      STA EQT34 
      INA 
      STA EQT35 
      INA 
      STA EQT36 
      INA 
      STA EQT37 
      INA 
      STA EQT38 
      JMP SETP,I    EXIT. 
      SPC 2 
*  CF920 USES EQT19-21 TO CONFIGURE PARAMETERS FOR
*  INPUT AND OUTPUT LINES AND STOP BITS FOR EQT5. 
      SPC 1 
CF920 EQU * 
      NOP 
      LDB SBITP     ADDR OF STOP BITS 
      LDA EQT19,I 
      AND B60 
      STA SAVEX     SAVE PARITY ITEM
      SZA,RSS       NO PARITY ? 
      JMP CF92A     YES.
      CPA B20       ODD PARITY? 
      RSS           YES.
      INB           NO. EVEN PARITY.
CF92A EQU * 
      LDA B,I 
      STA EQT5,I    SAVE DEVICES STOP BITS. 
      LDA EQT19,I 
      AND B17       CALC. 
      ADA B2         1 START AND 1 STOP BIT.
      STA B 
      LDA EQT19,I 
      AND =B200       
      SZA            2 STOP BITS? 
      INB            YES. 
      LDA SAVEX      NO. ONE. CHK PARITY. 
      SZA            PARITY ON? 
      INB            YES. 
      STB A 
      ADA M1
      AND B7        SAVE 3 BITS ONLY. 
      ALF,ALF           LENGTH
      STA EQT34,I   SAVE CHAR LENGTH
      LDB SAVEX 
      SZB           PARITY ON ? 
      IOR BIT12     YES. PARITY PARAMETER.
      IOR TPARI     SET TRANSMIT AND PARAMETER BITS.
      STA EQT35,I   SAVE PARTIAL TRANS/PARM NO. 
      LDA EQT21,I   FIND
      AND RHALF       TRANSMIT
      ADA SPTBP         SPEED 
      LDA A,I             PARAMETER.
      AND RHALF 
      IOR EQT35,I 
      STA EQT35,I   TRANSMIT PARM COMPLETED.
*  OUTPUT PARAMETERS COMPLETED. 
      LDA EQT21,I 
      ALF,ALF       FIND
      AND RHALF       RECEIVE 
      ADA SPTBP         SPEED 
      LDA A,I             PARAMETER.
      AND RHALF 
      IOR EQT34,I 
      LDB EQT19,I 
      BLF,BLF 
      RBL 
      SSB           ECHO ON?
      IOR BIT12 
      IOR RPARI 
      STA EQT34,I   INPUT PARAMETERS COMPLETED. 
      CLA 
      STA EQT25,I 
      STA EQT36,I   INITIALIZE
      STA EQT37,I     OTHER 
      STA EQT38,I          PARAMETERS.
      LDB NULCP      NULL CHAR ADDR 
      LDA SAVEX 
      SZA           PARITY ON ? 
      INB           YES.
      LDA B,I       GET NULL CHAR.
      STA NULL
      JMP CF920,I   RETURN. 
      SPC 2 
*  COUT2 OUTPUTS CONTROL PARAMETERS TO THE 2ND CONTROL BOARD. 
      SPC 1 
COUT2 EQU * 
      NOP 
      IOR UNIT      INSERT UNIT # 
OTA40 OTA SC+3      4TH BOARD (2ND CONTROL BOARD) 
STCF4 STC SC+3,C
      JMP COUT2,I 
      SPC 2 
*  COUT OUTPUTS CONTROL PARAMETERS TO THE 1ST CONTROL BOARD.
      SPC 1 
COUT  EQU * 
      NOP 
      IOR UNIT
OTA30 OTA SC+2      CONTROL BOARD # 1 
STCF3 STC SC+2,C
      JMP COUT,I
      SPC 2 
*  OUT - TRANSMITS 16 BITS TO THE MUX BOARD.
      SPC 1 
OUT   EQU * 
      NOP 
LIB20 LIB SC+1      CHK SEEKING.
      SSB           OK TO SEND? 
      JMP *-2       NO. WAIT. 
OTA10 OTA SC        OUTPUT DATA/PARAMETERS. 
      LDA UNIT
OTA20 OTA SC+1      SEND UNIT #.
STC10 STC SC        INITIATE TRANSFER.
      JMP OUT,I 
      SPC 2 
*  CHAR - TRANSMIT A CHARACTER
      SPC 1 
CHAR  EQU * 
      NOP 
      IOR PQT5,I    ADD STOP BITS.
      JSB OUT       SEND CHAR TO MUX BOARD. 
      JMP CHAR,I
      SPC 2 
*  FCL12 - GET CONTROL LINE STATI FOR HALF DUPLEX LINE (202 MODEM). 
      SPC 1 
FCL12 EQU * 
      NOP 
      LDA EQT25,I 
      AND LHALF 
      ALF,ALF 
      STA B 
      LDA EQT25,I 
      AND RHALF 
      JMP FCL12,I 
      SPC 2 
*  SRSCU - SAVES RETURN ADDR, SC, CONFIGURES OUTPUT ROUTINE FOR 
*          OUTCC SUBROUTINE AND ACKNOWLEDGEMENT INSTRUCTION.
* 
*          CALLING SEQUENCE:   LDB X73YZ     INTERRUPT ENTRY ADDR.
*                              JSB SRSCU
      SPC 1 
SRSCU EQU * 
      NOP 
      STB RTADD     SAVE RETURN ADDR. 
      LIA 4 
      STA SAVSC     SAVE SELECT CODE. 
      IOR CLFAC     CONFIGURE INTERRUPT 
      STA CLFSC       ACKNOWLEDGEMENT INST
      LDA SAVSC     CONFIGURE LIA INST. 
      IOR LIAAC 
      STA *+1 
      NOP 
      STA DATA
      AND =B76000    STRIP OUT
      STA UNIT        UNIT AND RT.
      ALF           JUSTIFY UNIT #. 
      RAL,RAL 
      STA DUNIT 
      JMP SRSCU,I 
      SPC 1 
CLFAC CLF 0 
OTACC OTA 0 
LIAAC LIA 0 
LIBAC LIB 0 
STCAC STC 0 
STCF0 STC 0,C 
      SPC 2 
*  TIMRT - IS CALLED BY $TIME WHEN A PHYSICAL OR
*          LOGICAL TIMEOUT OCCURS.
*          TIMRT THEN DECIDES WHICH DVR THE TIMEOUT OCCURRED
*          FOR AND CALLS THAT DVR INDICATING A TIMEOUT OCCURRED.
* 
*          CALLING SEQ:   LDA ID   EQT ADDR 
*                         JSB TIMRT 
      SPC 1 
TIMRT EQU * 
      NOP 
      CLF 0 
      LDB TIMRT     SAVE RETURN ADDRESS 
      STB RTADD      IN UNIVERSAL RETURN ADDR.
      SSA           LOGICAL DVR TIMEOUT INT.? 
      JMP TIMPH     NO. PHYSICAL. 
      STA 300B      YES.
      STA B 
      JSB SETP      SET EQT POINTERS
      LDA PQT3,I
      AND UNIM1     GET 4 BIT 
      ALF             UNIT # AND
      STA UNIT          SAVE IT IN UNIT.
      ALF,RAL 
      RAL           RT. JUSTIFY FOR 
      STA DUNIT       DUNIT.
      JSB CONFG     CONFIGURE I/O INST. 
      CLA 
      STA TIMV,I    CLEAR TIMEOUT IN PROGRESS FLG.
      LDA EQT36,I 
      SSA           PROCESSING AUTO-SPEED?
      JMP TIM97     YES. SET TIMEOUT BIT ETC. 
      AND B60 
      STA XFLG      SAVE TRANSITION STATE.
      SZA           TRANS STATE = 0?
      JMP TIMXX     NO. 
      LDB EQT36,I 
      SLB,RBR       READ IN PROGRESS? 
      JMP TIM98     YES. PREPARE TO CALL P73RR. 
      SLB           NO. WRITE IN PROGRESS?
      JMP TIM99     YES. PREPARE TO CALL P73WR. 
      JMP TIM97     NO. PREPARE TO CALL P73CR.
TIMXX EQU * 
      CPA B20       TRANSITIONING TO READ STATE?
      JMP TIM98     YES. PREPARE TO CALL P73RR. 
TIM99 EQU *         PREPARE TO CALL P73WR.
      LDA BIT15     INDICATE TIMEOUT STATUS.
      JMP P73WR     GO TO WRITE PROCESSOR.
TIM98 EQU * 
      LDA BIT15     INDICATE TIMEOUT STATUS.
      JMP P73RR     GO TO READ PROCESSOR. 
TIM97 EQU * 
      LDA BIT15 
      JMP P73CW     CALL CONTROL PROCESSOR. 
      SPC 1 
TIMPH EQU * 
      CMA,INA 
      STA B         MAKE EQT ADDR POSITIVE. 
      JSB SETP      SET EQT POINTERS. 
      LDA PQT3,I
      AND UNIM1     SVE UNIT
      ALF             NUMBER
      STA UNIT         IN ITEM UNIT.
      JSB CONFG 
      CLA 
      STA PTIMV,I   CLEAR TIMEOUT IN PROGRESS FLG.
      LDA EQT36,I 
      AND =B177377   CLEAR BIT8(AUTO-SPEED DELAY)4-15-75
      STA EQT36,I                         4-15-75 
      AND B60 
      STA XFLG
      SZA,RSS       TRANSITION STATE = 0 ?
      JSB COM73     YES. COMPLETE LINE OPENS/CLOSE. 
* 
      CPA B40       NO. TRANS. TO SEND ?
      JMP TIMWR     YES.
      JSB CLINE     NO. TRANS TO RECEIVE. 
      SSB           LINE IN RECEIVE STATE?
      JSB TIMAG     NO. TRY AGAIN.
TIMFR LDA SSAF      YES. RAISE "SA" AND INHIBIT 
      JSB COUT2      INTERRUPTS FOR "SB" CHANGES. 
      LDA EQT36,I   SET 
      AND =B117700    LINE STATE
      INA               TO
      STA EQT36,I         RECEIVE STATE.
TIMEX JSB RETRN 
      SPC 1 
TIMAG NOP 
      ISZ PQT15,I   LAST ATTEMPT? 
      RSS           NO. 
      JMP TIMAG,I   YES. FORCE READ/WRITE.
      CCB           DELAY 100 MIL/SEC 
      JSB PTIMR 
      JSB RETRN     WAIT FOR TIMEOUT. 
      SPC 1 
*     TURNING LINE TO SEND STATE. 
      SPC 1 
TIMWR EQU * 
      JSB FCL12 
      SLA,RSS       CC UP ? 
      JMP TIMWT     NO. TRY AGAIN.
      STB A         YES.
      AND B3
      CPA B3        CB AND SB  UP ? 
      RSS           YES. LINE IN RECEIVE STATE. SKIP. 
TIMWT EQU * 
      JSB TIMAG     NO. TRY AGAIN.
      LDA EQT36,I   SET 
      AND =B117700    LINE STATE
      IOR B2            TO SEND.
      STA EQT36,I 
      LDA PQT6,I
      AND B177      OUTPUT 1ST CHAR 
      JSB CHAR        FROM LOGICAL DVR. 
      JSB RETRN     EXIT. 
      SPC 2 
*  CONFIG - CONFIGURES THE OUTPUT INSTRUCTIONS FOR
*           OUTPUT SUBROUTINES. 
* 
*           CALLING SEQUENCE:  JSB CONFG
      SPC 1 
CONFG EQU * 
      NOP 
      LDA PQT3,I    GET BASE
      AND B77         SELECT CODE 
      STA SAVSC 
      ADA OTACC     CONFIGURE 
      STA OTA10       ALL 
      INA               OTA 
      STA OTA20           INSTRUCTIONS. 
      INA 
      STA OTA30 
      INA 
      STA OTA40 
* 
      LDA SAVSC     CONFIGURE 
      ADA STCAC       STC 
      STA STC10         INST. 
      AND B77 
      INA           CONFIGURE 
      ADA LIBAC 
      STA LIB20 
      STA LIB21      LIB INSTRUCTIONS 
      LDA STCF0 
      IOR SAVSC 
      ADA B2
      STA STCF3 
      INA 
      STA STCF4 
      JMP CONFG,I      RETURN.
      SPC 2 
*    THIS SUBR UPDATES THE STATI OF BOTH CONTROL BOARDS.
      SPC 1 
UPD25 EQU * 
      NOP 
      LDA DATA
      LDB RTADD 
      CPB P73C1     BOARD # 1 INT.
      JMP P731      YES.
      LDB EQT19,I   NO. BOARD # 2.
      SSB           FULL DUPLEX?
      JSB RETRN     YES. ERROR.  EXIT.
      SPC 1 
*  CURRENTLY PROCESSING INTERRUPT FROM CONTROL BOARD # 2. 
      SPC 1 
P732  ALF,ALF 
      XOR EQT25,I 
      AND LHALF 
      ALF,ALF 
      LDB EQT19,I 
      RBL           MOVE SEC. CH. BIT TO BIT # 15.
      SSB,RSS       IS SEC. CH. AVAILABLE ? 
      ERA,CLE,ELA   NO. SEC. CH. CAN'T CAUSE INTERRUPT. 
      STA SAVEC 
      JMP P733
      SPC 1 
*  CURRENTLY PROCESSING INTERRUPT FROM BOARD # 1. 
      SPC 1 
P731  EQU * 
      XOR EQT25,I 
      AND RHALF 
      STA SAVEC 
P733  LDA DATA
      AND RHALF 
      LDB EQT19,I    UPDATE EQT25 
      SSB           FULL DUPLEX?
      JMP P735      YES.
      LDB RTADD     NO. 
      CPB P73C1     CONTROL BOARD # 1 INT?
      JMP P734      YES.
      ALF,ALF       NO. 
      STA B         BOARD # 2.
      LDA EQT25,I 
      AND RHALF     KEEP BOARD # 1'S STATUS.
      JMP P735-1
P734  EQU * 
      STA B 
      LDA EQT25,I 
      AND LHALF     KEEP BOARD # 2'S STATUS.
      IOR B 
P735  EQU * 
      LDB EQT19,I 
      RBL 
      SSB,RSS       IS SEC. CH. AVAILABLE ? 
      IOR BIT8      NO. SET SEC. REC. (SB) ON.
      STA EQT25,I   SET BOARD STATUS. 
      SLB           DEVICE HALF DUPLEX ?
      JMP TIMD1     NO.  FULL DUPLEX. 
      CLB           YES.
      LDA EQT36,I 
      AND B77 
      CPA B1        LINE IN RECEIVE STATE ? 
      JMP P736R     YES.
      CPA B2        LINE IN SEND STATE ?
      JMP P737W     YES.
      JMP TIMD2     NO. GOOD STATUS. LET TIMPH TURN 
*                                      THE LINE AROUND AND CHECK STATUS.
P736R EQU * 
      LDA EQT25,I   CHK LINE STATUS SIGNALS.
      AND =B1003    KEEP "CB,CF, AND CC". 
      CPA B3        "CF AND CC" UP ?
      JMP TIMD2     YES. GOOD RECEIVE STATUS. 
      JMP TIMD2-1   NO. BAD RECEIVE STATUS. 
      SPC 1 
P737W EQU * 
      LDA EQT25,I   CHK LINE STATUS 
      AND =B1401    KEEP "CB,SB, AND CC" .
      CPA =B1401    "CB,SB, AND CC"  UP ? 
      JMP TIMD2     YES. GOOD SEND STATUS.
      ALF,ALF 
      SLA           "SB"  DOWN ?
      JMP TIMD2-1   NO. LINE ERROR. 
      LDB BIT12     YES. BREAK. 
      JMP TIMD2 
TIMD1 EQU *         FULL DUPLEX.
      CLB 
      LDA EQT25,I 
      AND B1        103 ,S SHOULD ALWAYS = B3. BUT
      CPA B1        H/W ASR33,S ALWAYS = B1. "" CC UP.
      RSS 
      LDB BIT14     LINE ERROR !!!!!!!!!! 
TIMD2 EQU * 
      STB LSTAT,I   SAVE LINE STATUS IN PQT16,I(EQT16). 
      JMP UPD25,I    RETURN.
      SPC 2 
CISUB EQU * 
      NOP 
      JSB SRSCU 
      AND B17 
      STA DUNIT 
      ALF,ALF 
      RAL,RAL 
      STA UNIT
      LDA SAVSC 
      ADA OTACC 
      STA OCCSC 
      LDA STCF0 
      IOR SAVSC 
      STA OCCSC+1 
      LDA DUNIT 
      JMP CISUB,I 
      SPC 2 
*   SET INTERNAL EQT ADDR TABLE.
      SPC 1 
SEQAD EQU * 
      NOP 
      JSB CALED     RETURN WITH A-REG.=ENTRY ADDR.
      LDB PQT1      EQT ADDR
      STB A,I 
      JMP SEQAD,I 
      SPC 2 
*   CLEAR AN ENTRY IN INTERNAL EQT TABLE. 
      SPC 1 
CEQAD EQU * 
      NOP 
      JSB CALED 
      CLB 
      STB A,I 
      JMP CEQAD,I 
      SPC 2 
*   FIND INTERNAL EQT ADDR ENTRY
      SPC 1 
CALED EQU * 
      NOP 
      LDA PQT3,I    RT. JUSTIFY 
      AND UNITM       5 BIT 
      ALF,ALF           UNIT # AND
      RAL,RAL             ADD INTERNAL EQT
      ADA UNEQP             TBL BASE ADDR.
      JMP CALED,I 
* 
*     THIS SUBR IS CALLED WHEN LINE OPEN AUTO-SPEED COMPLETES OR
*     WHEN DVR73 IS DIRECTED TO READ/WRITE DURING A LINE OPEN 
*     AUTO-SPEED REQUEST. 
*     IT CONFIGURES THE MAIN PORTS TO THEIR CORRECT SPEED AND 
*     PERFORMS THE REQUIRED HOUSEKEEPING FOR COMPLETING AUTO-SPEED. 
* 
*     CALLING SEQ:  JSB CFSPD 
* 
*          RETURN:   P+1
      SPC 1 
CFSPD NOP 
      LDA EQT36,I   CLEAR AUTO-SPEED INDICATION.
      ELA,CLE,ERA    WHEN RD/WT DIRECTIVE IS
      IOR BIT8      SET AUTO-SPEED FLAG.
      STA EQT36,I     ISSUED DURING AUTO-SPEED OR 
      CLB              ON COMPLETION OF AUTO-SPEED. 
      LDA 300B      = EQT ADDR OF ACTIVE DEVICE.
      CPA LASM1     ACTIVE DEV ON MUX # 1 ? 
      JMP *+3       YES 
      STB LASM2     NO. CLEAR LSAT MAIN FOR MUX #2. 
      RSS           SKIP. 
      STB LASM1     CLEAR LSAT MAIN FOR MUX # 1.
      LDA PQT3,I
      AND UNIM1     SET UNIT =
      ALF             UNIT # OF 
      STA UNIT          THE MAIN PORT.
      LDA EQT21,I   GET INDEX 
      AND RHALF       TO SPEED PARM TBL.
      ADA SPTAD     ADD TO SPEED TBL STARTING ADDR. 
      LDB A,I       FETCH SPEED PARM. 
      LDA EQT34,I   INSERT RECEIVE
      AND =B170000    PORTS 
      IOR B            SPEED PARM AND 
      STA EQT34,I       CLEAR DIAG BIT (11).
      STB SAVEC     SAVE SPEED PARM.
      JSB OUT       UPDATE RCV PORT'S PARMS.
      LDA EQT35,I 
      AND =B170000
      IOR SAVEC     UPDATE SEND 
      STA EQT35,I     PORT'S SPEED
      JSB OUT           PARM. 
      JMP CFSPD,I   RETURN. 
      END 
                                                                                                                                