IMD 1.16: 1/09/2008 12:01:57 84-93390-01-a300 f39001 rje terminal emulator floppy diskette rje.asm rje.jcl rjed.mac 2/23/81    @0|)wwЀЀtQql)  " }gA ` MIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 ME476030106490700760301064907 760301064907=1) * PUTSPCS EQU $ COPY Q,TI:SCR(Y) SAVE COUNT PS01 EQU $ / COPY =GS:,A SET COMPRESSED SPACE INDICATOR COPY TI:LFW(Y),Q LINE FLAG WORD TBIT LIF:XLT,Q TRANSLATION REQUIRED FLAG JF OV,$+2 NO TRANSLATION, JUST STORE JSK XLTBYT TRANSLATE CHARACTER CODE JSK PUTBYT PLUG IN BUFFER COPY TI:SCR(Y),A SPACE COUNT CSK A,=64 FIND MODE TO USE JMP PS03 CAN HANDLE IN ONE, GO SET UP JMP PS02 TWO COUNTS REQUIRED, GO SET UP COPY =2,Q SET REMAINDER OF TWO COPY =62,A SET SPACE COUNT OF 62 JMP PS04 PS02 EQU $ / COPY A,Q COPY =63,A SET SPACE COUNT THIS TIME SUB A,Q SET REMAINDER FOR NEXT JMP PS04 PS03 EQU $ / COPY =0,Q SET NO REMAINDER PS04 EQU $ / COPY Q,TI:SCR(Y) SAVE COUNT FOR NEXT TIME OR =:40,A SET SPACE COUNT FLAG JSK PUTBYT PLUG SPACE COUNT COPY TI:SCR(Y),A COUNT REMAINING JNE A,PS01 LOOP IF MORE RSK RETURN TO CALLER TITL LPOOL END  TITL RJE TERMINAL EMULATOR PROTOCOL ACTIVITY (93390-10-A300) * SHARABLE RJE: ROMMABLE RJE: SYSTEM RJE: REL * nam g:b NAM BP:PREM NAM BP:LOOP NAM BP:IOX NAM BP:DLAY NAM BP:WAIT NAM BP:BIOB,BP:BBCB NAM BP:SEND NAM BP:PBUF,BP:GBUF NAM BP:FPUT,BP :FGET,BP:RPUT,BP:RGET NAM BP:ERRC * * PICO FUNCTION EQUATES * OPEN EQU FU:%4+OPN: CLOSE EQU FU:%4+CLS: EXECUT EQU FU:%4+EXU: SETAA EQU FU:%4+SAA: SET AUTO ANSWER ************************************************** * BISYNC PROTOCOL ACTIVITY *************************************************************** * g:b equ $ debug register * BGIN:A BP:PREM,BP:TDB,BP:PRI * * TASK DESCRIPTOR BLOCK * TDB:A BP:TDB,BP:PROT,BYSCR,0,256,0,2 BP:PROT EQU $ * * AR = DUMMY DRIVER DIB ADDRESS * COPY =0,Q COPY =BYSCR-1,X COPY Q,0(X,Y) INITIALIZE A WORD OF SCRATCH JNED X,$-1 LOOP FOR ALL COPY A,BDIBA(Y) SAVE EMULATOR DIB ADDRESS COPY A,X COPY DI:CIB(X),A GET EMULATOR CIB ADDRESS COPY A,BCIBA(Y) SAVE IN Y-SCR * * INITIALIZE NON-ZERO SCRATCH LOCATIONS * COPY BDIBA(Y),X EMULATOR DIB ADDRESS TO X COPY DI:LFW(X),A LINE FLAG WORD COPY A,BLFW(Y) SAVE IN Y COPY DI:CCH(X),A CONTROL CHAR. SEGMENT TABLE ADDRESS COPY A,BCCPT(Y) SAVE IN Y COPY DI:CCT(X),A CHANNEL CONTROL SEG. TABLE ADDRESS COPY A,BCCTL(Y) SAVE IN Y COPY DI:TO1(X),A RESPONSE TO ENQ. TIMEOUT COPY A,BTIMR1(Y) SAVE IN Y COPY DI:TO2(X),A RCV RESPOND TO BCC OPERATION TIMEOUT COPY A,BTIMR2(Y) SAVE IN Y SHIFT A,LO,2 CONVERT TO QUARTER SECONDS SUB =2,A SUBTRACT ONE-HALF SECOND JGT A,$+2 COPY =1,A USE .25 SECOND IF NECESSARY COPY A,BTIMR4(Y) SAVE AS RESPONSE DELAY INTERVAL COPY DI:TO3(X),A AUTOMATIC DISCONNECT TIMEOUT COPY A,BTIMR3(Y) SAVE IN Y COPY DI:RTY(X),A RETRY THRESHOLD COPY A,BRTRYT(Y) SAVE IN Y COPY DI:WRT(X),A WRITE THRESHOLD COPY A,BWRTT(Y) SAVE IN Y COPY DI:ENQ(X),A ENQUIRY THRESHOLD COPY A,BENQT(Y) SAVE IN Y COPY =BPBCB,A OFFSET TO BCB AREA IN Y-SCR ADD Y,A ADD Y-SCR ADDRESS COPY A,BBCBA(Y) SAVE FIRST BCB ADDRESS COPY BCIBA(Y),X CIB ADDRESS COPY Y,CI:PTY(X) SAVE SCRATCHPAD ADDRESS * * GET DEVICE NAME FROM CIB FOR IOB'S * COPY =IO:ST,X OFFSET TO END OF IOB COPY =0,A COPY A,BPIOB(X,Y) CLEAR THE IOB JNED X,$-1 COPY BCIBA(Y),X EMULATOR CIB ADDRESS COPY CI:PNAM(X),A GET DEVICE NAME COPY A,BIOBLUN(Y) SAVE IN IOB * * OPEN PICO DRIVER * COPY =OPEN,A COPY A,BIOBFC(Y) SET FUNCTION CODE FOR OPEN I:IO BPIOB(Y) REQUEST TO PICO DRIVER JMP BP:PR01 ERROR ON OPEN * * HANDLE AUTOANSWER PROCESSING * COPY BLFW(Y),A LINE FLAG WORD TBIT LIF:AAE,A AUTOANSWER ENABLE FLAG JF OV,BP:PR10 NOT SET, JUST FINISH INITIALIZATION COPY =SETAA,A COPY A,BIOBFC(Y) SET FUNCTION CODE FOR AUTOANSWER I:IO BPIOB(Y) REQUEST TO PICO DRIVER JMP BP:PR01 ERROR ON AUTOANSWER JMP BP:PR10 JUST FINISH UP INITIALIZATION * * ERROR IN INITIALIZATION * BP:PR01 EQU $ /  COPY BIOBST(Y),A STATUS RETURNED FROM PICO DRIVER COPY A,BERRCOD(Y) SAVE FOR EMULATOR DRIVER COPY =1%BDISCD,A SET DISCONNECTED STATUS COPY =NULL,Q SET NULL LINE CONTROL SEGMENT JMP BP:PR11 * * COMPLETION OF INITIALIZATION * BP:PR10 EQU $ / COPY =1%BCTLMD,A SET CONTROL MODE STATUS SBIT BINIT,A SET FLAG FOR INITIAL LINE BID COPY =RDINIT,Q READ INITIAL CONTROL SEGMENT BP:PR11 EQU $ / COPY A,BLSW(Y) SAVE STATUS WORD COPY Q,BLCI(Y) SAVE CONTROL SEGMENT INDEX JSK BP:SEND SIGNAL COMPLETION TO EMULATOR DRIVER * * WAIT FOR A XMIT OR RECEIVE OPERATION * BP:LOOP EQU $ / COPY BECMD(Y),A DRIVER REQUEST WORD TBIT BDIE,A SUICIDE REQUESTED FLAG JF OV,$+2 NOT REQUESTED, CONTINUE JMP BP:TERM GO END IT ALL COPY BLSW(Y),Q LINE STATUS WORD TBIT BDISCD,Q DISCON  NECTED FLAG JF OV,BP:LP1 NOT DISCONNECTED, CONTINUE JEQ A,BP:LP3 NO REQUESTS, JUST GO WAIT JSK BP:SEND JUST WAKE DRIVER FOR ALL REQUESTS JMP BP:LP3 GO WAIT FOR SUICIDE REQUEST BP:LP1 EQU $ / TBIT BDISC,A CHECK DISCONNECT REQUESTED JF OV,BP:LP2 NO, TRY NEXT COPY =WRTDCN,X SET LINE CONTROL INDEX JMP BP:LCTL GO DO IT BP:LP2 EQU $ / TBIT BTMODE,A TRANSMIT REQUESTED FLAG JF OV,BP:LP3 NO, TRY NEXT COPY BLSW(Y),Q LINE STATUS WORD TBIT BLBIP,Q LINE BID IN PROGRESS FLAG JT OV,BP:LP3 JUST CONTINUE IF SO  SBIT BLBIP,Q ELSE SET FLAG COPY Q,BLSW(Y) COPY =WRTENQ,X SET INDEX FOR ENQ JMP BP:LCTL GO DO IT BP:LP3 EQU $ / COPY BLCI(Y),X LINE CONTROL INDEX JMP BP:LCTL DO THAT * LPOOL TITL * * JMP TO LINE CONTROL SEGMENT * * XR = OFFSET TO LINE CONTROL SEGMENT IN * LINE CONTROL SEGMENT ADDRESS TABLE. * BP:LCTL EQU $ / COPY *BCCTL(X,Y),X CONTROL SEGMENT ADDRESS JMP 0(X) GO TO REQUESTED SEGMENT * * CHANNEL CONTROL ROUTINES RETURN HERE * TO EXECUTE THE REQUIRED I/O FUNCTION * BP:IOX EQU $ / COPY BBCBA(Y),X GET CURRENT BCB ADDRESS SUB =6,X BACKUP TO LAST BCB COPY =0,A COPY A,BCB:LK(X) SET NO NEXT I:IO BPIOB(Y) EXECUTE I/O NOP IGNORE ERRORS FOR NOW COPY =RDINIT,A COPY A,BLCI(Y) SET DEFAULT LINE CONTROL INDEX COPY BIOBHED(Y),X FIRST BCB ADDRESS JEQ X,BP:LOOP CONTINUE IF NONE (SHOULD NOT HAPPEN) * * MAIN LOOP FOR CHECKING I/O RESULTS * BP:IOL EQU $ / COPY X,BBCBA(Y) SET CURRENT BCB ADDRESS COPY BCB:ST(X),A STATUS RETURNED COPY BCB:FC(X),Q FUNCTION CODE WORD AND =:30,Q MASK FUNCTION CODE TBIT ER:B,A ERROR FLAG JT OV,BP:IL4 PROCESS I/O REQUEST ERROR TBIT CM:B,A OPERATION COMPLETED FLAG JF OV,BP:IL3 OUT OF CHECKING LOOP IF NOT CLSN Q,=B:READ CHECK FOR READ REQUEST JMP BP:IL1 PROCESS COMPLETION CODES IF SO CLSN Q,=B:WRIT CHECK FOR WRITE REQUEST JMP BP:IL2 IGNORE IT IF SO BP:IL0 EQU $ / COPY BLSW(Y),Q LINE STATUS WORD TBIT BDIP,Q DISCONNECT IN PROGRESS FLAG JF OV,BP:IL2 NOT DISCONNECTING, IGNORE JSK BP:DCONN GO TO DISCONNECTED STATE JMP BP:LOOP BP:IL1 EQU $ / JSK BP:PSOM PROCESS STARTING CONTROL CHARACTER JSK BP:PEOM PROCESS ENDING CONTROL CHARACTER BP:IL2 EQU $ / COPY BBCBA(Y),X CURRENT BCB ADDRESS COPY BCB:LK(X),X NEXT BCB ADDRESS JNE X,BP:IOL PROCESS IF PRESENT JMP BP:LOOP BACK TO MAIN LOOP WHEN DONE BP:IL3 EQU $ / COPY BIOBLST(Y),A LAST BCB PROCESSED CSK A,X CHECK IF THIS IS LAST JMP BP:LOOP BACK TO MAIN LOOP IF NOT JMP BP:LOOP COPY BIOBST(Y),A STATUS RETURNED JLT A,$+2 ERROR FLAG SET, CONTINUE JMP BP:LOOP BACK TO MAIN LOOP IF NOT CLSN Q,=B:WSUP CHECK FOR SUPERVISORY SEQUENCE JMP BP:IL0 TEST DISCONNECT IF SO BP:IL4 JMP BP:ERR ELSE CHECK FOR A READ ERROR * * PROCESS START OF MESSAGE INDEX (SOMI) * BP:PSOM EQU $ / COPY BBCBA(Y),X BCB ADDRESS COPY BCB:ST(X),A GET COMPLETION STATUS AND =BCBSI:,A ISOLATE START OF MSG INDEX SHIFT A,RO,11 RIGHT JUSTIFY IT COPY A,X COPY BLSW(Y),Q LINE STATUS WORD TBIT BCTLMD,Q CONTROL MODE FLAG JF OV,PSOM1 NOT CONTROL MODE, CHECK TRANSMIT/RECEIVE TBIT BLBIP,Q LINE BID IN PROGRESS FLAG JF OV,PSOM2 NOT BIDDING FOR LINE, USE INDEX DIRECTLY ADD =4,X ADD OFFSET FOR LINE BIDDING JMP PSOM2 PSOM1 EQU $ / ADD =8,X ADD OFFSET FOR DATA TRANSFER MODE TBIT BMODE,Q TRANSMIT/RECEIVE FLAG JF OV,PSOM2 TRANSMIT, USE INDEX AS IS ADD =4,X ADD OFFSET FOR RECEIVE PSOM2 EQU $ / COPY *BCCPT(X,  Y),X CONTROL SEG TABLE ADDRESS JSK 0(X) EXECUTE THE SEGMENT RSK * * PROCESS THE END OF MSG INDEX (EOMI) * BP:PEOM EQU $ / COPY BBCBA(Y),X BCB ADDRESS COPY BCB:ST(X),A GET COMPLETION STATUS AND =BCBEI:,A ISOLATE EOM CODE SHIFT A,RO,7 RIGHT JUSTIFY COPY A,X ADD =16,X ADD OFFSET TO EOM SEGMENTS COPY BLSW(Y),Q LINE STATUS WORD TBIT BCTLMD,Q CONTROL MODE FLAG JF OV,PEOM1 NOT CONTROL MODE, CHECK TRANSMIT/RECEIVE TBIT BLBIP,Q LINE BID IN PROGRESS FLAG JF OV,PEOM2 NOT BIDDING FOR LINE, USE INDEX DIRECTLY ADD =16,X ADD OFFSET FOR LINE BIDDING JMP PEOM2 PEOM1 EQU $ / ADD =32,X ADD OFFSET FOR DATA TRANSFER MODE TBIT BMODE,Q TRANSMIT/RECEIVE FLAG JF OV,PEOM2 TRANSMIT, USE INDEX AS IS ADD =16,X ADD OFFSET FOR RECEIVE PEOM2 EQU $ / COPY *BCCPT(X,Y),X CHANNEL CONTROL SEG TBL ADDRS JSK 0(X) GO TO IT RSK * * TERMINATE PROTOCOL ACTIVITY * BP:TERM EQU $ / COPY =0,A COPY BCIBA(Y),X EMULATOR CIB ADDRESS TO X COPY A,CI:PTY(X) ZERO Y-SCR CELL IN EMULATOR CIB COPY =CLOSE,A COPY A,BIOBFC(Y) SET FUNCTION CODE FOR CLOSE I:IO BPIOB(Y) REQUEST TO PICO DRIVER NOP IGNORE ALL ERRORS R:END * LPOOL TITL * * I/O REQUEST ERROR HANDLING * BP:ERR EQU $ / CSK Q,=B:READ CHECK FOR READ REQUEST JMP BP:ER1 NO RECOVERY IF NOT A READ JMP BP:ER1 AND =:7F,A MASK ERROR CODE CLSN A,=TIMOT: CHECK TIMEOUT JMP BP:ER4 CLSN A,=EOTPD: EOT PAD CHECK JMP BP:ER5 CLSN A,=NAKPD: NAK PAD CHECK JMP BP:ER5 CLSN A,=BCCER: BCC ERROR JMP BP:ER8 CLSN A,=ILLCC: ILLEGAL CONTROL CODE JMP BP:ER8 CLSN A,=RCVOR: RECEIVE OVERRUN JMP BP:ER8 CLSN A,=LGOVR: LEADING GRAPHICS OVERRUN JMP BP:ER8 CLSN A,=MSGAB: MESSAGE ABORTED JMP BP:ER8 * * FATAL ERROR * BP:ER1 EQU $ / NEG A,A NEGATE ERROR CODE JSK BP:ERRC SAVE FOR DRIVER BP:ER2 EQU $ / COPY BLSW(Y),A LINE STATUS WORD TBIT BDIP,A DISCONNECT IN PROGRESS FLAG JT OV,BP:ER3 YES, NO SECOND ATTEMPT SBIT BDIP,A SET DISCONNECT IN PROGRESS COPY A,BLSW(Y) COPY =WRTDCN,X ATTEMPT DISCONNECT JMP BP:LCTL BP:ER3 EQU $ / JSK BP:DCONN GO TO DISCONNECTED STATE JMP BP:LOOP WAIT FOR SUICIDE REQUEST * * RECOVERABLE RECEIVE ERRORS * BP:ER4 EQU $ / COPY BCB:FC(X),A FUNCTION CODE FROM BCB SHIFT A,RO,6 POSITION TIMEOUT VALUE AND =:1F,A MASK ADD BIDLET(Y),A ACCUMULATE TIME IDLE COPY A,BIDLET(Y) COPY BTIMR3(Y),A AUTOMATIC DISCONNECT TIMEOUT JEQ A,BP:ER5 DISABLED, JUST CONTINUE CSK A,BIDLET(Y) CHECK FOR TIMEOUT EXPIRED JMP BP:ER2 EXPIRED, GO TO DISCONNECT NOP BP:ER5 EQU $ / COPY BLSW(Y),A LINE STATUS WORD TBIT BLBIP,A LINE BID IN PROGRESS FLAG JT OV,BP:ER7 YES, TRY ANOTHER ENQ TBIT BLACT,A LINE ACTIVE FLAG JF OV,BP:ER6 NO, JUST USE CONTROL SEGMENT SET TBIT BMODE,A RECEIVE/TRANSMIT MODE FLAG JF OV,BP:ER7 TRANSMIT, TRY ANOTHER ENQ MASK:OUT BRHDR,BRTXT,BRTTXT JNE A,BP:ER9 IN TEXT, NACK AND REREAD BP:ER6 EQU $ / JMP BP:LOOP GO CHECK DRIVER REQUESTS BP:ER7 EQU $ / COPY =WRTENQ,A SET WRITE ENQ CONTROL SEGMENT COPY A,BLCI(Y) JMP BP:LOOP GO CHECK DRIVER REQUESTS BP:ER8 EQU $ / COPY BLSW(Y),A LINE STATUS WORD TBIT BLACT,A LINE ACTIVE FLAG JF OV,BP:ER10 JUST TRY READ IF NOT TBIT BMODE,A RECEIVE/TRANSMIT MODE FLAG JF OV,BP:ER7 ANOTHER ENQ IF TRANSMIT MODE BP:ER9 EQU $ / COPY BLSW(Y),A GET LINE STATUS WORD (PATCH)  MASK:OFF BRHDR,BRTXT,BRTTXT COPY A,BLSW(Y) CLEAR TEXT MODE FLAGS COPY =WNACK,A SET WRITE NAK CONTROL SEGMENT COPY A,BLCI(Y)   JMP BP:LOOP GO CHECK DRIVER REQUESTS BP:ER10 EQU $ / TBIT BLBIP,A LINE BID IN PROGRESS FLAG JT OV,BP:ER7 YES, JUST SEND ANOTHER ENQ JMP BP:ER6 ELSE DO READ * LPOOL * * BUILD IOB SUBROUTINE * BP:BIOB EQU $ / COPY =0,A INITIALIZE MODIFIABLE WORDS COPY A,BIOBBCT(Y) COPY A,BIOBBUF(Y) COPY A,BIOBACT(Y) COPY A,BIOBST(Y) COPY =EXECUT,A COPY A,BIOBFC(Y) SET FUNCTION CODE TO EXECUTE BCBS * * INIT BCB POINTER * COPY =BPBCB,A OFFSET TO BCB AREA ADD Y,A ADD TO Y ADDRESS COPY A,BBCBA(Y) SAVE IN BCB POINTER COPY A,BIOBHED(Y) LINK BCB TO IOB RSK * * BUILD CURRENT BCB * AR = BCB FUNCTION CODE * BP:BBCB EQU $ / COPY BBCBA(Y),X BCB ADDRESS COPY A,BCB:FC(X) STORE FUNCTION CODE COPY =0,A COPY A,BCB:ST(X) CLEAR SOFTWARE STATUS COPY A,BCB:AC(X) CLEAR ACTUAL COUNT * * SET UP NEXT BCB AND CHAIN IT TO THE LAST BCB * COPY BBCBA(Y),A CURRENT BCB ADDRESS ADD =6,A OFFSET TO NEXT BCB COPY A,*BBCBA(Y) CHAIN NEW BCB TO CURRENT COPY A,BBCBA(Y) MAKE NEW BCB THE CURRENT RSK TITL * * ENTER DISCONNECTED STATE ROUTINE * BP:DCONN EQU $ COPY BLSW(Y),A LINE STATUS WORD RBIT BDIP,A CLEAR DISCONNECT IN PROGRESS SBIT BDISCD,A SET DISCONNECTED STATE COPY A,BLSW(Y) COPY =NULL,A COPY A,BLCI(Y) SET NULL LINE CONTROL SEGMENT COPY =0,A EXCH BUFF(Y),A GET CURRENT BLOCKING BUFFER AND DEREFERENCE JEQ A,$+2 JUST RETURN IF NO CURRENT JSK BP:FPUT RETURN BUFFER TO FREE QUEUE RSK TITL * * PUT BUFFER ON QUE * * XR = QUEUE ADDRESS * AR = BUFFER ADDRESS * BP:PBUF EQU $ / SIN 4 INHIBIT INTERRUPTS COPY 0(X),Q 1ST FREE BUFFER CELL JNE Q,PUT1 HAS A BUFFER IN IT COPY A,0(X) EMPTY, PUT BUFFER HERE RSK PUT1 EQU $ / COPY A,1(X) PUT IT IN #2 RSK * * GET BUFFER FROM QUEUE * * XR = QUEUE ADDRESS * AR = BUFFER ADDRESS ON RETURN * BP:GBUF EQU $ / SIN 6 INHIBIT INTERRUPTS COPY 0(X),A TRY 1ST BUFFER LOC. JEQ A,GET1 NO BUFFER HERE COPY 1(X),Q COPY Q,0(X) MOVE 2ND BUFFER UP COPY =0,Q COPY Q,1(X) ZERO 2ND BUFFER LOC RSK GET1 EQU $ / COPY =0,A RSK TITL * * GET BUFFER ROUTINES * AR = BUFFER ADDRESS ON RETURN * BP:RGET EQU $ / COPY =CI:RB1,X JMP BP:GET BP:FGET EQU $ / COPY =CI:FB1,X CIB OFFSET TO FREE QUEUE BP:GET EQU $ / ADD BCIBA(Y),X AD JSK BP:GBUF GO GET BUFFER RSK * * PUT BUFFER ROUTINES * * AR = BUFFER ADDRESS ON ENTRY * BP:RPUT EQU $ / COPY =CI:RB1,X CIB OFFSET TO READY QUE JMP BP:PUT BP:FPUT EQU $ / COPY =CI:FB1,X CIB OFFSET TO FREE QUE BP:PUT EQU $ / ADD BCIBA(Y),X ADD EMULATOR CIB ADDRESS JSK BP:PBUF COPY BECMD(Y),A DRIVER REQUEST FLAG WORD TBIT BBUFF,A WAITING FOR BUFFER FLAG JF OV,BP:PB1 NOT WAITING, JUST RETURN JSK BP:SEND WAKE THE DRIVER BP:PB1 EQU $ / RSK TITL * * BP:DLAY - SUBROUTINE TO SET A DELAY * * AR = DELAY COUNT IN QUARTER SECONDS * BP:DLAY EQU $ / COPY =0,Q INITIALIZE CLOCK PARAMETER BLOCK COPY Q,BTIMER(Y) COPY Q,BTIMER+3(Y) COPY A,BTIMER+4(Y) PLUG TIME INTERVAL IN BLOCK COPY BCIBA(Y),X CIB ADDRESS COPY CI:SDBP(X),A SEMAPHORE DEFINITION BLOCK ADDRESS COPY A,BTIMER+1(Y) PLUG AS IDENTIFIER COPY A,BTIMER+2(Y) PLUG AS SEMAPHORE R:IWAL BTIMER(Y) WAIT FOR SPECIFIED INTERVAL JSK BP:WAIT WAIT FOR SIGNAL R:CWAL BTIMER(Y) CANCEL TIMER IF NOT EXPIRED RSK BACK TO CALLER * * BP:WAIT - SUBROUTINE TO WAIT FOR SIGNAL * BP:WAIT EQU $ / COPY BLSW(Y),A LINE STATUS WORD SBIT BWAIT,A SET WAITING FOR SIGNAL C  OPY A,BLSW(Y) COPY BCIBA(Y),X DUMMY CIB ADDRESS COPY CI:SDBP(X),X SEMAPHORE BLOCK ADDRESS R:WAIT 0(X) WAIT FOR TIMER TO EXPIRE COPY BLSW(Y),A LINE STATUS WORD RBIT BWAIT,A CLEAR WAITING FOR SIGNAL COPY A,BLSW(Y) RSK * * SEND SEMAPHORE TO EMULATOR DRIVER ROUTINE * BP:SEND EQU $ / COPY BCIBA(Y),X EMULATOR CIB ADDRESS COPY CI:SDBD(X),X SENAPHORE BLOCK ADDRESS R:SIG 0(X) COPY =0,A COPY A,BECMD(Y) CLEAR DRIVER REQUEST WORD RSK TITL * * SAVE ERROR CODE FOR EMULATOR DRIVER ROUTINE * BP:ERRC EQU $ / COPY A,BERRCOD(Y) SAVE THE ERROR CODE COPY BECMD(Y),A DRIVER REQUEST WORD JEQ A,$+2 NO REQUESTS, JUST RETURN JSK BP:SEND SIGNAL DRIVER FOR COMPLETION OF REQUEST RSK * END TITL RJE TERMINAL EMULATOR LINE CONTROL SEGMENTS (93390-10-A300) * SHARABLE RJE: ROMMABLE RJE: SYSTEM RJE: REL * nam g:c NAM BP:CTS EXTR BP:LOOP EXTR BP:IOX EXTR BP:BIOB,BP:BBCB EXTR BP:SEND EXTR BP:DLAY EXTR BP:WAIT EXTR BP:RGET,BP:FGET,BP:RPUT,BP:FPUT EXTR BP:ERRC EXTR BP:RCNT * g:c equ $ debug register * TITL * *  2770/2780/3780 CHANNEL CONTROL SEGMENT ADDRESS TABLE * BP:CTS EQU $ * * SOME ASSEMBLER ERROR NECESSITATES I PUT THESE DEFS HERE WRTPR: EQU 3 BY: EQU 2 WORD BP:WRIT WRITE CONTINUE SEGMENT WORD BP:WPA WRITE POSITIVE ACKNOWLEDGE WORD BP:WNAK WRITE NEGATIVE ACKNOWLEDGE WORD BP:WENQ WRITE ENQ WORD BP:RLSB RELEASE LAST BUFFER WORD BP:RSND RESEND LAST BUFFER WORD BP:RDIN READ INITIAL WORD BP:WEOT WRITE EOT WORD BP:WDCN WRITE DISCONNECT SEQ. WORD BP:WEOTR WRITE EOT RESET WORD BP:NULL NULL OPERATION TITL * * WRITE NEXT BLOCK * BP:WRIT EQU $ / JSK BP:BIOB BUILD IOB FOR THIS BCB STRING * * GET NEXT READY BUFFER * JSK BP:RGET GET NEXT READY BUFFER JEQ A,BP:WTTD TEXT DELAY IF NO BUFFER BP:WRTB EQU $ / COPY A,BUFF(Y) SAVE BUFFER ADDRESS BP:WRTR EQU $ /  COPY =1,A COPY A,BCBIDX(Y) INIT. BCB INDEX BP:WRT1 EQU $ / COPY BUFF(Y),X BLOCK BUFFER ADDRESS ADD BCBIDX(Y),X OFFSET TO RECORD WORD COPY =B:WRIT+LC:ST,A FUNCTION CODE FOR TEXT BLOCK COPY BF:REC(X),Q RECORD WORD JGE Q,BP:WRT2 TEXT MODE RECORD, CONTINUE RBIT 15,Q TURN OFF FLAG BIT COPY =B:WRIT+LC:TT,A FUNCTION CODE FOR TRANSPARENT BP:WRT2 EQU $ / SBIT SY:B,A FLAG TO PRECEDE WITH SYNCS SHIFT Q,RO,1 FORM WORD OFFSET JF OV,$+2 EVEN BYTE, CONTINUE SBIT SB:B,A FLAG SECOND BYTE OF BUFFER ADD BUFF(Y),Q ADD BUFFER BASE COPY Q,BTMP(Y) SAVE RECORD ADDRESS COPY BF:REC+1(X),Q START OFFSET OF NEXT RECORD SUB BF:REC(X),Q LENGTH OF THIS RECORD RBIT 15,Q FORCE OFF TEXT/TRANSPARENT FLAG COPY BBCBA(Y),X BCB ADDRESS COPY Q,BCB:RC(X) REQUEST COUNT COPY BTMP(Y),Q COPY Q,BCB:BA(X) BUFFER ADDRESS COPY BUFF(Y),X BUFFER ADDRESS COPY BCBIDX(Y),Q CURRENT INDEX CSK Q,BF:CPR(X) CHECK LAST RECORD OR =TC:IB,A NOT LAST, SET TERMINATION JMP BP:WRT4 (NOT TAKEN BY CSK) COPY BF:EOF(X),Q EOF BUFFER FLAG JNE Q,BP:WRT3 EOF BUFFER, GO SET TERMINATION OR =TC:EB,A NOT EOF, SET TERMINATION JMP BP:WRT4 BP:WRT3 EQU $ / OR =TC:EX,A EOF, SET TERMINATION BP:WRT4 EQU $ / JSK BP:BBCB COPY BCBIDX(Y),Q CURRENT RECORD INDEX IMS BCBIDX(Y) INC. BCB INDEX COPY BUFF(Y),X BLOCK BUFFER ADDRESS CSK Q,BF:CPR(X) CHECK END JMP BP:WRT1 LOOP FOR ALL RECORDS NOP * * BLOCK COMPLETE... * COPY BTIMR2(Y),A GET BLOCK RESPONSE INTERVAL JMP BP:RRSP GO BUILD READ RESPONSE BCB * * WRITE TTD SEQUENCE * BP:WTTD EQU $ / COPY BTIMR4(Y),A TEXT DEL  AY TIME JSK BP:DLAY WAIT FOR TIMEOUT JSK BP:RGET CHECK FOR READY BUFFER JNE A,BP:WRTB SEND IT IF AVAILABLE COPY =C:TTD,A JSK BP:WSUP SEND TTD SEQUENCE COPY BTIMR2(Y),A GET RESPONSE TIMER JMP BP:RRSP GO BUILD RESPONSE BCB * * * READ RESPONSE TO LAST WRITE * AR = TIMEOUT VALUE * BP:RRSP EQU $ / SHIFT A,LO,6 POSITION FOR BCB FUNCTION ADD =B:READ,A ADD READ FUNCTION CODE JSK BP:BBCB COPY Y,A Y-SCR ADDRESS ADD =BRSPBF,A ADD OFFSET TO RESPONSE BUFFER COPY A,BCB:BA(X) STORE IN BCB COPY =BRSBFL,A BYTE COUNT COPY A,BCB:RC(X) STORE IN BCB JMP BP:IOX GO TO COMMON I/O SEGMENT LPOOL TITL * * WRITE RESPONSE TO LAST READ (AR = RESPONSE SUPVSRY SEQ. CODE) * BP:WRES EQU $ / JSK BP:WSUP WRITE SUPERVISORY SEQ. FOR RESPONSE COPY BLSW(Y),A LINE STATUS WORD TBIT BINIT,A INITIAL LINE BID FLAG JF OV,WRES1 NOT INITIAL, JUST DO READ COPY BLFW(Y),A LINE FLAG WORD TBIT LIF:TID,A TERMINAL IDENTIFICATION MODE FLAG JF OV,WRES1 NO IDENTIFICATION, JUST READ COPY =2,A SET LENGTH OF TWO JSK GETTID SET UP TRANSMISSION OF TERMINAL ID WRES1 EQU $ / COPY BUFF(Y),X CURRENT BUFFER ADDRESS JNE X,BP:READ REGULAR READ IF BUFFER PRESENT COPY BTIMR2(Y),A GET RESPONSE INTERVAL JMP BP:RRSP GO READ RESPONSE * * BUILD READ BLOCK BCB * BP:READ EQU $ / COPY BUFF(Y),X BUFFER ADDRESS COPY =0,A COPY A,BF:CPR(X) CLEAR COUNT PRESENT COPY A,BF:EOF(X) CLEAR EOF FLAG COPY =BF:DATA*2,A COPY A,BF:REC(X) INITIALIZE 0-TH RECORD OFFSET COPY =1,A COPY A,BCBIDX(Y) INITIALIZE RECORD INDEX BP:RD1 EQU $ / COPY =B:READ,A SET READ FUNCTION CODE COPY BCBIDX(Y),Q BCB INDEX CLSN Q,=1 CHECK FIRST JMP BP:RD2 FIRST RECORD, SET BUFFER PARAMETERS SBIT CF:B,A SET CONTINUE READ FLAG COPY BBCBA(Y),X BCB ADDRESS COPY =0,Q COPY Q,BCB:BA(X) CLEAR BUFFER ADDRESS COPY Q,BCB:RC(X) CLEAR REQUEST COUNT JMP BP:RD3 GO FINISH BCB BP:RD2 EQU $ / COPY BDIBA(Y),X DIB ADDRESS COPY DI:BKS(X),Q BLOCK SIZE FOR EMULATION COPY BBCBA(Y),X BCB ADDRESS COPY Q,BCB:RC(X) SET COUNT REQUESTED COPY BUFF(Y),Q BUFFER ADDRESS ADD =BF:DATA,Q OFFSET TO DATA AREA COPY Q,BCB:BA(X) SET BUFFER ADDRESS COPY BTIMR2(Y),Q BLOCK RESPONSE INTERVAL SHIFT Q,LO,6 POSITION FOR BCB FUNCTION OR Q,A MERGE INTO CONTROL WORD BP:RD3 EQU $ / JSK BP:BBCB FINISH SETUP OF BCB COPY BCBIDX(Y),A CURRENT BCB INDEX IMS BCBIDX(Y) INC INDEX SUB =8,A JNE A,BP:RD1 KEEP BUILDING BCB'S JMP BP:IOX DO THE I/O * * READ INITIAL * BP:RDIN EQU $ / JSK BP:BIOB INIT. IOB  COPY BLSW(Y),A LINE STATUS WORD TBIT BCTLMD,A CONTROL MODE FLAG JT OV,RDIN1 IN CONTROL MODE, DO SHORT READ TBIT BMODE,A TRANSMIT/RECEIVE MODE FLAG JF OV,RDIN1 IN TRANSMIT, DO SHORT READ COPY BUFF(Y),X CURRENT BUFFER ADDRESS JNE X,BP:READ BUFFER PRESENT, DO FULL READ RDIN1 EQU $ / COPY BTIMR2(Y),A GET BLOCK RESPONSE INTERVAL JMP BP:RRSP GO READ RESPONSE TITL * * RELEASE LAST WRITE BUFFERS * BP:RLSB EQU $ / COPY =0,A COPY A,BWRTC(Y) INIT. WRITE THRESHOLD COUNTER COPY A,BRTRYC(Y) INITIALIZE RETRY COUNTER COPY BUFF(Y),X CURRENT BUFFER COPY BF:EOF(X),Q EOF FLAG COPY Q,BTMP(Y) SAVE FOR CHECKING LATER COPY X,A JSK BP:FPUT RETURN FREE BUFFER COPY =0,A COPY A,BUFF(Y) ZERO OUT BUFFER ADDRESS CELL COPY BTMP(Y),A EOF FLAG JNE A,BP:RL1 END OF TRANSMIT PROCESSING IF SET JMP BP:WRIT GO WRITE NEXT BLOCK BP:RL1 EQU $ / COPY BECMD(Y),A EMULATOR DRIVER REQUEST WORD TBIT BTERM, A CHECK FOR TERMINATION REQUESTED JF OV,$+2 NOT REQUESTED, CHECK ACKNOWLEDGE TYPE JSK BP:SEND CLEAR REQUEST AND SIGNAL DRIVER  COPY BLSW(Y),A LINE STATUS WORD TBIT BMODE,A TRANSMIT/RECEIVE MODE FLAG JT OV,$+2 RECEIVE MODE, NAK CONVERSATIONAL REPLY JMP BP:WEOT TRANSMIT MODE, SEND EOT JMP BP:WNAK * * RESEND LAST BLOCK * BP:RSND EQU $ / IMS BWRTC(Y) INC WRITE COUNTER COPY BWRTC(Y),Q WRITE COUNTER VALUE CSK Q,BWRTT(Y) CHECK LIMIT EXCEEDED JSK BP:BIOB NO, BUILD IOB JMP BP:WRTR GO WRITE RESPONSE (NOT TAKEN BY CSK) COPY =-WRTTH:,A JSK BP:ERRC REPORT ERROR TO DRIVER JMP BP:WDCN FORCE DISCONNECT * LPOOL TITL * * WRITE ENQUIRY SEQ. (LINE BID OR SOLICIT A RESPONSE) * BP:WENQ EQU $ / IMS BENQC(Y) INCREMENT ENQ COUNTER COPY BENQC(Y),Q ENQ COUNTER VALUE CSK Q,BENQT(Y) CHECK LIMIT EXCEEDED JMP BP:WNQ2 GO WRITE ENQ NOP COPY BLSW(Y),A LINE STATUS WORD TBIT BLBIP,A LINE BID IN PROGRESS FLAG JT OV,BP:WNQ1 BIDDING FOR LINE, NO DISCONNECT COPY =-ENQTH:,A REPORT LIMIT EXCEEDED TO USER JSK BP:ERRC REPORT ERROR TO DRIVER JMP BP:WDCN FORCE DISCONNECT BP:WNQ1 EQU $ / RBIT BLBIP,A RESET BID IN PROGRESS FLAG COPY A,BLSW(Y) COPY =-WRTPR:,A SET WRITE PROTECTED ERROR JSK BP:ERRC JSK BP:RCNT RESET COUNTERS FOR RETRY JMP BP:RDIN JUST DO A READ BP:WNQ2 EQU $ / JSK BP:BIOB BUILD IOB COPY =C:ENQ,A JSK BP:WSUP BUILD WRITE ENQ SUP. SEQ. COPY BLSW(Y),A LINE STATUS WORD TBIT BINIT,A CHECK FOR INITIAL LINE BID JF OV,BP:WNQ3 NOT INITIAL, CONTINUE COPY BLFW(Y),A LINE FLAG WORD TBIT LIF:TID,A TERMINAL IDENTIFICATION MODE FLAG JF OV,BP:WNQ3 NOT REQUIRED, CONTINUE SHIFT A,RO,LIF:TCC POSITION CHARACTER COUNT AND =7,A MASK IDENTIFICATION LENGTH JSK GETTID SET UP TRANSMISSION OF TERMINAL ID BP:WNQ3 EQU $ / COPY BLSW(Y),A LINE STATUS WORD TBIT BCTLMD,A CONTROL MODE FLAG COPY BTIMR1(Y),A SET TIMER FOR CONTROL MODE JT OV,$+2 CORRECT, USE VALUE COPY BTIMR2(Y),A SET TIMER FOR BLOCK RESPONSE JMP BP:RRSP BUILD READ RESPONSE BCB TITL * * WRITE EOT SEQ. (SET CONTROL MODE) * BP:WEOT EQU $ / COPY BLSW(Y),A LINE STATUS WORD MASK:OUT BINIT,BDISCD SBIT BCTLMD,A SET CONTROL MODE COPY A,BLSW(Y) JSK BP:RCNT CLEAR ERROR COUNTERS BP:WEOTR EQU $ / COPY =0,A COPY A,BBLKS(Y) INITIALIZE ACKNOWLEDGE BLOCK COUNTER JSK BP:BIOB INIT IOB COPY =C:EOT,A JSK BP:WSUP WRITE EOT SEQUENCE COPY BTIMR2(Y),A SET TIMER FOR BLOCK RESPONSE JMP BP:RRSP GO BUILD READ RESPONSE BCB * * NULL OPERATION * BP:NULL EQU $ / JSK BP:WAIT WAIT A WHILE JMP BP:LOOP CHECK FOR ANYTHING HAPPENING TITL * * WRITE POSITIVE ACKNOWLEDGEMENT * BP:WPA EQU $ / COPY =WPACK,A SET INDEX FOR REPEATS COPY A,BLRES(Y) JSK BP:RCNT RESET THE ERROR COUNTERS JSK BP:BIOB COPY BLSW(Y),A LINE STATUS WORD TBIT BOPIP,A OPERATION IN PROGRESS FLAG JF OV,WPA2 NOT IN PROGRESS, MUST NEED BUFFER TBIT BLACT,A LINE ACTIVE FLAG JT OV,WPA2 LINE ACTIVE, MUST NEED BUFFER * * CHECK FOR TERMINATION REQUESTED * COPY BECMD(Y),A EMULATOR DRIVER REQUEST WORD TBIT BTERM,A TERMINATION REQUESTED FLAG JT OV,WPA1 REQUESTED, COMPLETE PROCESSING COPY BTIMR4(Y),A GET RESPONSE DELAY INTERVAL JSK BP:DLAY DELAY COPY BECMD(Y),A EMULATOR DRIVER REQUEST WORD TBIT BTERM,A TERMINATION REQUESTED FLAG JF OV,WPA3 SEND A WAIT ACKNOWLEDGEMENT IF NOT WPA1 EQU $ / JSK BP:SEND SIGNAL DRIVER AND CLEAR REQUEST COPY BLSW(Y),A LINE STATUS WORD RBIT BO PIP,A CLEAR OPERATION IN PROGRESS FLAG COPY A,BLSW(Y) * * CHECK FOR FREE BUFFER FOR NEXT READ * WPA2 EQU $ / COPY BUFF(Y),A BUFFER ADDRESS JNE A,WPA4 PRESENT, GO SET UP JSK BP:FGET GET A FREE BUFFER JNE A,WPA4 GOT BUFFER, ACKNOWLEDGE COPY BTIMR4(Y),A GET RESPONSE DELAY INTERVAL JSK BP:DLAY SET DELAY JSK BP:FGET TRY AGAIN FOR A BUFFER JNE A,WPA4 GOT A BUFFER * * TRANSMIT WAIT ACKNOWLEDGEMENT * WPA3 EQU $ / COPY =C:DDLE+C:WACK,A SEND WACK JMP BP:WRES * * WRITE POSITIVE ACKNOWLEDGEMENT * WPA4 EQU $ / COPY A,BUFF(Y) SAVE BUFFER ADDRESS COPY BBLKS(Y),A TBIT 0,A COPY =C:DDLE+C:ACK0,A ASSUME EVEN ACKNOWLEDGEMENT JF OV,$+2 CORRECT, CONTINUE COPY =C:DDLE+C:ACK1,A ELSE ODD ACKNOWLEDGEMENT JMP BP:WRES WRITE ACK SEQ TITL * * WRITE NEGATIVE ACKNOWLEDGEMENT * BP:WNAK EQU $ / COPY =WNACK,A COPY A,BLRES(Y) SAVE INDEX FOR REPEATS JSK BP:BIOB COPY =C:NACK,A JMP BP:WRES WRITE NAK SEQ * * WRITE DISCONNECT SEQUENCE * BP:WDCN EQU $ / COPY =1%BCTLMD,A SET CONTROL MODE SBIT BDIP,A SET DISCONNECT IN PROGRESS COPY A,BLSW(Y) JSK BP:BIOB COPY BLFW(Y),Q LINE FLAG WORD TBIT LIF:LT,Q LINE TYPE FLAG COPY =C:DDLE+C:EOT,A ASSUME SWITCHED LINE JF OV,$+2 CORRECT, USE AS IS COPY =C:EOT,A ELSE JUST SEND EOT JSK BP:WSUP JMP BP:IOX GO WITHOUT SETTING A READ * * BUILD WRITE SUPERVISORY SEQUENCE BCB ROUTINE * BP:WSUP EQU $ / ADD =B:WSUP,A ADD WRITE SUP. FUNCTION CODE JSK BP:BBCB COPY =0,A COPY A,BCB:BA(X) ZERO BUFFER ADDRESS IN BCB COPY A,BCB:RC(X) ZERO BYTE COUNT RSK * LPOOL TITL * * GET TERMINAL IDENTIFICATION SEQUENCE ROUTINE * * CALLED WITH AR = NUMBER OF BYTES TO USE, SETS UP TRANSMISSION. * GETTID EQU $ COPY A,BTIDL(Y) SAVE LENGTH COPY A,BCB:RC(X) SET REQUEST COUNT COPY Y,A ADD =BTID,A COPY A,BCB:BA(X) SET BUFFER ADDRESS COPY =0,Q INITIALIZE OFFSET GTID1 EQU $ / COPY Q,X CURRENT OFFSET IN BYTES SHIFT X,RO,1 CONVERT TO WORDS ADD BDIBA(Y),X ADDRESS WITHIN DIB OF WORD COPY DI:TID(X),A WORD CONTAINING CURRENT BYTE JT OV,$+2 ODD BYTE, CORRECTLY POSITIONED SHIFT A,RO,8 EVEN BYTE, POSITION IT AND =:FF,A MASK TERMINAL IDENTIFICATION SEQUENCE BYTE COPY BLFW(Y),X LINE FLAG WORD TBIT LIF:XLT,X TRANSLATION REQUIRED FLAG JF OV,GTID2 NO TRANSLATION, GO TO SAVE COPY BDIBA(Y),X DIB ADDRESS COPY DI:WTT(X),X TRANSMIT TRANSLATION TABLE ADDRESS SHIFT A,RO,1 FORM WORD OFFSET AND BYTE FLAG ADD A,X ADDRESS OF WORD IN TABLE COPY 0(X),A WORD FROM TRANSLATION TABLE JT OV,$+2 ODD BYTE, POSITIONED CORRECTLY SHIFT A,RO,8 EVEN BYTE, SHIFT IT OVER AND =:FF,A MASK TRANSLATED BYTE GTID2 EQU $ COPY Q,X INDEX INTO TEXT AREA SBIT BY:,S COPYB A,BTID(X,Y) SAVE BYTE OF TERMINAL IDENTIFICATION RBIT BY:,S ADD =1,Q COUNT A BYTE COPIED CSK Q,BTIDL(Y) CHECK FOR COPY COMPLETE JMP GTID1 LOOP FOR ALL BYTES OF SEQUENCE NOP RSK RETURN FOR TRANSMISSION END TITL RJE TERMINAL EMULATOR CONTROL CHARACTER SEGMENTS (93390-10-A300) * SHARABLE RJE: ROMMABLE RJE: SYSTEM RJE: REL * nam g:d NAM BP:CHS NAM BP:RCNT EXTR BP:RPUT,BP:RGET,BP:FPUT,BP:FGET EXTR BP:BIOB,BP:SEND EXTR BP:ERRC * g:d equ $ debug register * TITL * * START OF MESSAGE SEGMENTS TABLE * CONTROL MODE, NO LINE BID IN PROGRESS * CONTROL MODE, LINE BID IN PROGRESS * DATA TRANSFER MODE, TRANSMIT ACTIVE * DATA TRANSFER MODE, RECEIVE ACTIVE * BP:CHS EQU $ WORD BP:NULL NO LEADING CONTROL WORD BP:NU LL SOH WORD BP:NULL STX WORD BP:NULL DLE-STX WORD BP:NULL NO LEADING CONTROL WORD BP:NULL SOH WORD BP:NULL STX WORD BP:NULL DLE-STX WORD BP:NULL NO LEADING CONTROL WORD BP:SOH SOH WORD BP:STX STX WORD BP:TSTX DLE-STX WORD BP:NULL NO LEADING CONTROL WORD BP:SOH SOH WORD BP:STX STX WORD BP:TSTX DLE-STX TITL * * END OF MESSAGE SEGMENTS TABLE * CONTROL MODE, NO LINE BID IN PROGRESS * CONTROL MODE, LINE BID IN PROGRESS * DATA TRANSFER MODE, TRANSMIT * DATA TRANSFER MODE, RECEIVE * WORD BP:NULL EOT WORD BP:ENQC ENQ WORD BP:NULL NAK WORD BP:NULL ACK0 WORD BP:NULL ACK1 WORD BP:NULL WACK WORD BP:NULL RVI WORD BP:NULL TTD WORD BP:DCN DLE-EOT WORD BP:NULL ITB WORD BP:NULL ETB WORD BP:NULL ETX WORD BP:NULL UNUSED WORD BP:NULL END OF HEADING WORD BP:NULL FAST SELECT WORD BP:NULL BUFFER FULL WORD BP:EOTT EOT WORD BP:ENQB ENQ WORD BP:NBID NAK WORD BP:ABID ACK0 WORD BP:RBID ACK1 WORD BP:WBID WACK WORD BP:RBID RVI WORD BP:RBID TTD WORD BP:DCNT DLE-EOT WORD BP:NULL ITB WORD BP:RBID ETB WORD BP:RBID ETX WORD BP:NULL UNUSED WORD BP:RBID END OF HEADING WORD BP:RBID FAST SELECT WORD BP:RBID BUFFER FULL WORD BP:EOTT EOT WORD BP:NULL ENQ WORD BP:NAK NAK WORD BP:ACK0 ACK0 WORD BP:ACK1 ACK1 WORD BP:WACK WACK WORD BP:RVI RVI WORD BP:NULL TTD WORD BP:DCNT DLE-EOT WORD BP:CONV ITB WORD BP:CONV ETB WORD BP:CONV ETX WORD BP:NULL UNUSED WORD BP:NULL END OF HEADING WORD BP:NULL FAST SELECT WORD BP:CONV BUFFER FULL WORD BP:EOTR EOT WORD BP:ENQ ENQ WORD BP:NULL NAK WORD BP:NULL ACK0 WORD BP:NULL ACK1 WORD BP:NULL WACK WORD BP:NULL RVI WORD BP:TTD TTD WORD BP:DCNR DLE-EOT WORD BP:ITB ITB WORD BP:ETB ETB WORD BP:ETX ETX WORD BP:NULL UNUSED WORD BP:ITB END OF HEADING WORD BP:FAST FAST SELECT WORD BP:BADB BUFFER FULL TITL * * COMMON NO-PROCESSING SEGMENT ROUTINE * BP:NULL EQU $ / RSK SPACE 2 * * START OF MESSAGE PROCESSING SEGMENTS *  SPACE 2 * * PROCESS START OF HEADER * BP:SOH EQU $ / COPY BLSW(Y),A LINE STATUS WORD MASK:OFF BRHDR,BRTXT,BRTTXT,BINIT SBIT BRHDR,A SET HEADER MODE JMP BP:REC GO TO SHARED RECORD PROCESSING * * PROCESS START OF TEXT (NORMAL AND TRANSPARENT) * BP:STX EQU $ / COPY BLSW(Y),A MASK:OFF BRHDR,BRTXT,BRTTXT,BINIT SBIT BRTXT,A SET TEXT MODE BP:REC EQU $ / COPY A,BLSW(Y) COPY =WNACK,A SET NAK RESPONSE IF NOT CHANGED JMP BP:CCXT BP:TSTX EQU $ / COPY BLSW(Y),A MASK:OFF BRHDR,BRTXT,BRTTXT,BINIT SBIT BRTTXT,A SET TRANSPARENT TEXT MODE JMP BP:REC GO FOR COMMON RECORD PROCESSING TITL * * END-OF-MESSAGE PROCESSING SEGMENTS * SPACE 2 * * PROCESS EOT AND DLE-EOT SEQUENCES * BP:DCNR EQU $ / COPY BLSW(Y),A LINE STATUS WORD TBIT BRTTXT,A FLAG FOR IN TRANSPARENT TEXT JT OV,EOTR1 JUST NACK IF SET SBIT BDISCD,A SET DISCONNECTED FLAG COPY A,BLSW(Y) JMP EOTR2 DO NORMAL EOT PROCESSING BP:EOTR EQU $ / COPY BLSW(Y),A LINE STATUS WORD MASK:OUT BRHDR,BRTXT,BRTTXT JEQ A,EOTR2 NOT IN ANY TEXT MODE, CHECK ABORT EOTR1 EQU $ / COPY =WNACK,A EOT IN TEXT, JUST SEND NACK JMP BP:CCXT EOTR2 EQU $ / COPY BLSW(Y),A LINE STATUS WORD TBIT BOPIP,A LINE ACTIVE FLAG JF OV,BP:EOTDM NOT ACTIVE, JUST CLEAN UP COPY =-RCVAB:,A SET RECEIVE ABORTED ERROR JSK BP:ERRC JMP BP:EOTDM DO COMMON CLEAN UP BP:DCNT EQU $ / COPY BLSW(Y),A LINE STATUS WORD SBIT BDISCD,A SET DISCONNECTED FLAG COPY A,BLSW(Y) BP:EO TT EQU $ / COPY =-XMTAB:,A SET TRANSMIT ABORTED ERROR JSK BP:ERRC JSK BP:RGET ATTEMPT TO GET A READY BUFFER JEQ A,BP:EOTDM NONE AVAILABLE, CHECK CURRENT JSK BP:FPUT RESTORE BUFFER TO FREE QUEUE BP:EOTDM EQU $ / COPY =0,A EXCH BUFF(Y),A CURRENT BUFFER ADDRESS AND DEREFERENCE JEQ A,BP:EOT NO BUFFER PRESENT, JUST CLEAN UP JSK BP:FPUT RESTORE BUFFER TO FREE QUEUE JMP BP:EOT GO TO COMMON CLEAN UP BP:DCN EQU $ / COPY BLSW(Y),A LINE STATUS WORD SBIT BDISCD,A SET DISCONNECTED MODE COPY A,BLSW(Y) JSK BP:ERRC BP:EOT EQU $ / JSK BP:RCNT CLEAR ERROR COUNTS COPY =0,A COPY A,BBLKS(Y) INITIALIZE ACKNOWLEDGEMENT COUNTER COPY BLSW(Y),A LINE STATUS WORD MASK:OUT BINIT,BDISCD MASK:ON BCTLMD COPY A,BLSW(Y) SET CONTROL MODE, ERROR PRESENT COPY =RDINIT,A SET READ INITIAL LINE CONTROL SEGMENT JMP BP:CCXT TITL * * PROCESS ENQ (LINE BID, TTD, RESPONSE SOLICIT) * BP:ENQB EQU $ / COPY BLFW(Y),A LINE FLAG WORD TBIT LIF:PS,A PRIMARY/SECONDARY FLAG JF OV,ENQB1 PRIMARY STATION, IGNORE CONTENTION COPY BLSW(Y),A LINE STATUS WORD RBIT BLBIP,A TURN OFF BID IN PROGRESS COPY A,BLSW(Y) JSK BP:RCNT RESET RETRY COUNTERS JMP BP:ENQC TREAT AS BID RECEIVED NORMALLY ENQB1 EQU $ / COPY =WRTENQ,A JMP BP:CCXT SEND ANOTHER ENQ BP:ENQC EQU $ / COPY BECMD(Y),A EMULATOR DRIVER REQUEST WORD TBIT BRMODE,A RECEIVE REQUESTED FLAG JT OV,ENQC1 REQUESTED, ACCEPT OTHER BID COPY BLFW(Y),Q LINE FLAG WORD TBIT LIF:ATE,Q AUTO-TURNAROUND ENABLE FLAG JT OV,ENQC1 ENABLED, ACCEPT OTHER BID COPY =WNACK,A JMP BP:CCXT REJECT BID WITH A NACK ENQC1 EQU $ / COPY BLSW(Y),A LINE STATUS WORD RBIT BCTLMD,A CLEAR CONTROL MODE FLAG SBIT BMODE,A SET RECEIVE MODE COPY A,BLSW(Y) COPY BECMD(Y),A EMULATOR DRIVER REQUEST WORD TBIT BTMODE,A TRANSMIT REQUESTED FLAG JF OV,$+2 NOT REQUESTED, JUST ACCEPT BID JSK BP:SEND SIGNAL THE DRIVER TO KILL TRANSMIT COPY =WPACK,A JMP BP:CCXT SEND ACK OR WACK BP:ENQ EQU $ / COPY BLSW(Y),A LINE STATUS WORD MASK:OUT BRHDR,BRTXT,BRTTXT JEQ A,ENQ1 NOT IN TEXT, PROCESS NORMALLY COPY =WNACK,A JMP BP:CCXT TREAT AS TTD AND REJECT WITH A NACK ENQ1 EQU $ / COPY BLRES(Y),A LAST RESPONSE INDEX JMP BP:CCXT RESEND LAST RESPONSE SEQUENCE * LPOOL * TITL * * RESPONSES TO LINE BID * BP:ABID EQU $ / COPY BLSW(Y),A LINE STATUS WORD MASK:OFF BLBIP,BCTLMD,BINIT,BMODE MASK:ON BOPIP,BLACT COPY A,BLSW(Y) SAVE FLAGS SET TO TRANSMIT JSK BP:SEND SIGNAL THE DRIVER TO START DATA IMS BBLKS(Y) CORRECT ACKNOWLEDGEMENT COUNTER NOP JSK BP:RCNT RESET THE ERROR COUNTERS COPY =WRITE,A SET TO WRITE FIRST BLOCK JMP BP:CCXT BP:WBID EQU $ / JSK BP:RCNT RESET THE ERROR COUNTERS BP:NBID EQU $ / COPY =WRTENQ,A JUST RETRY BID ON NEGATIVE RESPONSE JMP BP:CCXT BP:RBID EQU $ / COPY BLSW(Y),A LINE STATUS WORD TBIT BRESET,A LINE RESET FLAG JT OV,BP:NBID TREAT AS NACK IF PREVIOUSLY RESET SBIT BRESET,A ELSE SET FLAG FOR NEXT TIME COPY A,BLSW(Y) COPY =WRTRES,A TRY RESET OF THE LINE JMP BP:CCXT TITL * * PROCESS NAK RECEIVED * BP:NAK EQU $ / COPY BUFF(Y),A CHECK BUFFER AVAILABLE JEQ A,NAK1 NO IMS BRNAKS(Y) INC NAK COUNTER NOP COPY =RESEND,A JMP BP:CCXT GO RESEND LAST BLOCK NAK1 EQU $ / COPY =WRITE,A JMP BP:CCXT SEE IF WE CAN WRITE A BLOCK * * PROCESS ACK0 RECEIVED * BP:ACK0 EQU $ / COPY =0,A SET ACK0 INDICATION JMP BP:ACKN CHECK IF CORRECT * * ENTRY TO PROCESS ACK1 RECEIVED * BP :ACK1 EQU $ / COPY =1,A SET ACK1 INDICATION BP:ACKN EQU $ / XOR BBLKS(Y),A EXCLUSIVE OR WITH ACKNOWLEDGEMENT COUNTER AND =1,A ISOLATE EVEN/ODD BIT JEQ A,BP:GACK ACKNOWLEDGEMENT MATCHED, PROCESS IT COPY BENQC(Y),A ENQUIRY COUNTER JEQ A,ACKN1 RESPONSE TO BLOCK OR TTD, PREVENT RETRANSMIT COPY BLSW(Y),A LINE STATUS WORD TBIT BBADACK,A BAD ACKNOWLEDGEMENT INITIAL RESPONSE FLAG JT OV,ACKN2 SET, JUST TRY ANOTHER ENQUIRY COPY =RESEND,A TRY ANOTHER TRANSMISSION OF BLOCK JMP BP:CCXT ACKN1 EQU $ / COPY BLSW(Y),A LINE STATUS WORD SBIT BBADACK,A SET INITIAL RESPONSE BAD FLAG COPY A,BLSW(Y) ACKN2 EQU $ / COPY =WRTENQ,A TRY ANOTHER ENQUIRY JMP BP:CCXT BP:GACK EQU $ / COPY BLSW(Y),A LINE STATUS WORD RBIT BBADACK,A CLEAR INITIAL RESPONSE BAD FLAG COPY A,BLSW(Y) JSK BP:RCNT RESET THE ERROR COUNTERS IMS BBLKS(Y) INCREMENT BLOCK COUNT NOP IMS BTBLKS(Y) COUNT IN TOTAL BLOCKS NOP COPY =RELBUF,A JMP BP:CCXT RELEASE LAST XMIT BLOCK * * PROCESS WACK RECEIVED * BP:WACK EQU $ / JSK BP:RCNT RESET THE ERROR COUNTERS COPY =WRTENQ,A JMP BP:CCXT GO SEND ENQUIRY * * PROCESS REVERSE INTERRUPT (RVI) * BP:RVI EQU $ / COPY BLSW(Y),A SBIT BMBTP,A SET MESSAGE BUFFER TO PROCESS COPY A,BLSW(Y) JMP BP:GACK GO HANDLE INCREMENTING * * PROCESS TEMPORARY-TEXT-DELAY (TTD - STX,ENQ SEQ.) * BP:TTD EQU $ / COPY =WNACK,A JMP BP:CCXT RESPOND WITH A NAK * LPOOL * * PROCESS INTERMEDIATE TEXT BLOCK (ITB) OR END OF HEADING * BP:ITB EQU $ / COPY BBCBA(Y),X BCB ADDRESS COPY BCB:BA(X),Q RECORD POINTER SUB BUFF(Y),Q CONVERT TO OFFSET IN BUFFER COPY BCB:FC(X),A FUNCTION CODE WORD TBIT SB:B,A SECOND BYTE OF BUFFER FLAG ROTATE Q,LO,1 FORM BYTE OFFSET COPY BLSW(Y),A LINE STATUS WORD RBIT BRHDR,A FORCE OFF HEADER MODE COPY A,BLSW(Y) TBIT BRTTXT,A TRANSPARENT MODE FLAG JF OV,$+2 TEXT MODE, CONTINUE SBIT 15,Q SET FLAG FOR TRANSPARENT COPY BCB:AC(X),A BYTE COUNT ADD Q,A FORM END OFFSET COPY BUFF(Y),X DATA BUFFER ADDRESS IMS BF:CPR(X) COUNT RECORD PRESENT ADD BF:CPR(X),X OFFSET TO RECORD WORD COPY Q,BF:REC(X) SAVE STARTING OFFSET, FLAG COPY A,BF:REC+1(X) SAVE STARTING OFFSET FOR NEXT RSK * * PROCESS ETB * BP:ETB EQU $ / COPY BLSW(Y),A LINE STATUS WORD SBIT BLACT,A SET LINE ACTIVE SBIT BOPIP,A SET OPERATION IN PROGRESS COPY A,BLSW(Y) BP:ETC EQU $ / COPY BECMD(Y),A DRIVER REQUEST FLAG WORD TBIT BRMODE,A CHECK READ REQUEST FLAG JF OV,ETC1 JUST PROCESS IF NOT SET JSK BP:SEND SIGNAL THE DRIVER ETC1 EQU $ / JSK BP:ITB COPY BLSW(Y),A LINE STATUS WORD MASK:OFF BRHDR,BRTXT,BRTTXT COPY A,BLSW(Y) IMS BBLKS(Y) INC. BLOCK COUNT NOP IMS BTBLKS(Y) COUNT IN TOTAL BLOCKS NOP * * QUE DATA BLOCK TO DUMMY DRIVER * COPY BUFF(Y),A BUFFER ADDRESS JSK BP:RPUT PUT BUFFER IN READY QUE COPY =0,A COPY A,BUFF(Y) ZERO BUFFER ADDRESS IN SCRATCHPAD COPY =WPACK,A JMP BP:CCXT SEND PROPER POSITIVE ACK MSG * * PROCESS ETX * BP:ETX EQU $ / COPY BUFF(Y),X BUFFER ADDRESS COPY =-1,A COPY A,BF:EOF(X) SET EOF FLAG IN BUFFER COPY BLSW(Y),A LINE STATUS WORD SBIT BOPIP,A FORCE OPERATION IN PROGRESS RBIT BLACT,A FORCE LINE INACTIVE COPY A,BLSW(Y) JMP BP:ETC COMMON END OF BLOCK PROCESSING TITL * * FAST SELECT (LEADING GRAPHICS FOR SOH/STX) * BP:FAST EQU $ / COPY BUFF(Y),A CURRENT BUFFER ADDRESS JEQ A,FAST1 NO BUFFER AVAILABLE, IGNORE COPY BBCBA(Y),X BCB ADDRESS COPY BCB:AC(X),Q ACTUAL  BYTE COUNT COPY BUFF(Y),X CURRENT BUFFER ADDRESS COPY BF:CPR(X),A COUNT OF RECORDS PRESENT JNE A,FAST1 IGNORE IF PRIOR RECORDS COPY Q,BF:REC(X) BIAS START OF DATA COPY Q,BF:REC+1(X) FAST1 EQU $ / RSK * * BUFFER FULL (INCOMPATIBLE BLOCK SIZE) * BP:BADB EQU $ / COPY BUFF(Y),A CURRENT BUFFER ADDRESS JNE A,$+2 BUFFER PRESENT, INCOMPATIBLE BLOCK SIZE RSK BLOCK SHOULD NOT HAVE BEEN SENT COPY =WNACK,A SET NAK AS RESPONSE TO BLOCK JMP BP:CCXT TITL * * POSSIBLE CONVERSATIONAL MODE ACKNOWLEDGEMENT * BP:CONV EQU $ COPY BLSW(Y),A LINE STATUS WORD MASK:OUT BRHDR,BRTXT,BRTTXT JEQ A,BP:CNV1 NOT IN ANY TEXT MODE, JUST IGNORE COPY BUFF(Y),X CURRENT BUFFER ADDRESS JEQ X,BP:CNV1 NO CURRENT BUFFER, JUST IGNORE COPY BF:EOF(X),Q END OF FILE FLAG JEQ Q,BP:CNV1 NOT END OF FILE, JUST IGNORE COPY BLSW(Y),A LINE STATUS WORD SBIT BMODE,A SET RECEIVE MODE JMP BP:GACK DO ACKNOWLEDGEMENT PROCESSING BP:CNV1 EQU $ / RSK * * COMMON EXIT POINT FOR END OF MSG CONTROL CHAR. SEGMENTS * BP:CCXT EQU $ / COPY A,BLCI(Y) SAVE LINE CONTROL SEGMENT INDEX RSK TITL * * CLEAR ERROR COUNTER SUBROUTINE * BP:RCNT EQU $ / COPY =0,A COPY A,BRTRYC(Y) CLEAR RETRY COUNTER COPY A,BENQC(Y) CLEAR ENQUIRY COUNTER COPY A,BWRTC(Y) CLEAR WRITE COUNTER COPY A,BIDLET(Y) RESET DISCONNECT TIMER RSK * END TITL RJE TERMINAL EMULATOR TRANSLATION TABLES (93390-10-A300) * SHARABLE RJE: ROMMABLE RJE: SYSTEM RJE: REL * NAM BP:EBAS,BP:ASEB * * ASCII TO EBCDIC TRANSLATION TABLE * * ASCII CHARACTER IS USED AS A BYTE OFFSET * TO INDEX TO EBCDIC VALUE. * BP:ASEB EQU $ / WORD :0001 :00/:01 NUL/SOH WORD :0203 :02/:03 STX/ETX WORD :372D :04/:05 EOT/ENQ WORD :2E2F :06/:07 ACK/BEL WORD :1605 :08/:09 BS /HT WORD :250B :0A/:0B LF /VT WORD :0C0D :0C/:0D FF /CR WORD :0E0F :OE/:0F SO /SI  WORD :1011 :10/:11 DLE/DC1 WORD :1213 :12/:13 DC2/DC3 WORD :3C3D :14/:15 DC4/NAK WORD :3226 :16/:17 SYN/ETB WORD :1819 :18/:19 CAN/EM WORD :3F27 :1A/:1B SUB/ESC WORD :1C1D :1C/:1D FS /GS WORD :1E1F :1E/:1F RS /US WORD :404F :20/:21 SPACE/! WORD :7F7B :22/:23 " / # WORD :5B6C :24/:25 $ / % WORD :507D :26/:27 & / ' WORD :4D5D :28/:29 ( / ) WORD :5C4E :2A/:2B * / + WORD :6B60 :2C/:2D , / - WORD :4B61 :2E/:2F . - / WORD :F0F1 :30/:31 0 / 1 WORD :F2F3 :32/:33 2 / 3 WORD :F4F5 :34/:35 4 / 5 WORD :F6F7 :36/:37 6 / 7 WORD :F8F9 :38/:39 8 / 9 WORD :7A5E :3A/:3B : / ; WORD :4C7E :3C/:3D < / = WORD :6E6F :3E/:3F > / ? WORD :7CC1 :40/:41 @ / A WORD :C2C3 :42/:43 B / C WORD :C4C5 :44/:45 D / E WORD :C6C7 :46/:47 F / G WORD :C8C9 :48/:49 H / I WORD :D1D2 :4A/:4B J / K WORD :D3D4 :4C/:4D L / M WORD :D5D6 :4E/:4F N / O WORD :D7D8 :50/:51 P / Q WORD :D9E2 :52/:53 R / S WORD :E3E4 :54/:55 T / U WORD :E5E6 :56/:57 V / W WORD :E7E8 :58/:59 X / Y WORD :E900 :5A/:5B Z / [ WORD :0000 :5C/:5D BACK SLASH / ] WORD :5F6D :5E/:5F RAKE / UNDERSCORE WORD :0081 :60/:61 SINGLE QUOTE / SMALL A WORD :8283 :62/:63 SMALL B / SMALL C WORD :8485 :64/:65 SMALL D / SMALL E WORD :8687 :66/:67 SMALL F / SMALL G WORD :8889 :68/:69 SMALL H / SMALL I WORD :9192 :6A/:6B SMALL J / SMALL K WORD :9394 :6C/:6D SMALL L / SMALL M WORD :9596 :6E/:6F SMALL N / SMALL O WORD :9798 :70/:71 SMALL P / SMALL Q WORD :99A2 :72/:73 SMALL R / SMALL S WORD :A3A4 :74/:75 SMALL T / SMALL U WORD :A5A6 :76/:77 SMALL V / SMALL W  WORD :A7A8 :78/:79 SMALL X / SMALL Y WORD :A900 :7A/:7B SMALL Z / { WORD :0000 :7C/:7D FENCE / } WORD :0000 :7E/:7F WIGGLE / DEL * * EBCDIC TO ASCII TRANSLATION TABLE * * EBCDIC CODE IS USED AS BYTE INDEX * CORRESPONDING ASCII CHARACTER. * BP:EBAS EQU $ / WORD :0001 WORD :0203 WORD :0009 WORD :0000 WORD :0000 WORD :000B WORD :0C0D WORD :0E0F WORD :1011  WORD :1213 WORD :0000 WORD :0000 WORD :1819 WORD :0000 WORD :1C1D WORD :1E1F WORD :0000 WORD :0000 WORD :000A WORD :171B WORD :0000 WORD :0000 WORD :0005 WORD :0607 WORD :0000 WORD :1600 WORD :0000 WORD :0004 WORD :0000 WORD :0000 WORD :1415 WORD :001A WORD :2000 :40/:41 SPACE / WORD :0000 :42/:43 WORD :0000 :44/:45 WORD :0000 :46/:47 WORD :0000 :48/:49  WORD :002E :4A/:4B CENT / . WORD :3C28 :4C/:4D < / ( WORD :2B21 :4E/:4F + / BAR WORD :2600 :50/:51 & / WORD :0000 :52/:53 WORD :0000 :54/:55 WORD :0000 :56/:57 WORD :0000 :58/:59 WORD :5A24 :5A/:5B ! / $ WORD :2A29 :5C/:5D * / ) WORD :3B5E :5E/:5F ; / RAKE WORD :2D2F :60/:61 - , / WORD :0000 :62/:63 WORD :0000 :64/:65 WORD :0000 :66/:67 WORD :0000 :68/:69 WORD :002C :6A/:6B UNDEF. / , WORD :255F :6C/:6D % / UNDERSCORE _ WORD :3E3F :6E/:6F > / ? WORD :0000 :70/:71 WORD :0000 :72/:73 WORD :0000 :74/:75 WORD :0000 :76/:77 WORD :0000 :78/:79 WORD :3A23 :7A/:7B : / # WORD :4027 :7C/:7D @ / ' WORD :3D22 :7E/:7F = / " WORD :0061 :80/:81 UNDEF. /SMALL A WORD :6263 :82/:83 SMALL B / SMALL C WORD :6465 :84/:85 SMALL D / SMALL E WORD :6667 :86/:87 SMALL F / SMALL G WORD :6869 :88/:89 SMALL H / SMALL I WORD 0 :8A/:8B WORD 0 :8C/:8D WORD :0000 :8E/:8F WORD :006A :90/:91 UNDEF. / SMALL J WORD :6B6C :92/:93 SMALL K / SMALL L WORD :6D6E :94/:95 SMALL M / SMALL N WORD :6F70 :96/:97 SMALL O / SMALL P WORD :7172 :98/:98 SMALL Q / SMALL R WORD :0000 :9A/:9B WORD :0000 :9C/:9D WORD :0000 :9E/:9F WORD :0000 :A0/:A1 WORD :7374 :A2/:A3 SMALL S / SMALL T WORD :7576 :A4/:A5 SMALL U / SMALL V WORD :7778 :A6/:A7 SMALL W / SMALL X WORD :797A :A8/:A9 SMALL Y / SMALL Z WORD :0000 :AA/:AB WORD :0000 :AC/:AD WORD :0000 :AE/:AF WORD :0000 :B0/:B1 WORD :0000 :B2/:B3 WORD :0000 :B4/:B5 WORD :0000 :B6/:B7 WORD :0000 :B8/:B9 WORD :0000 :BA/:BB WORD :0000 :BC/:BD WORD :0000 :BE/:BF WORD :0041 :C0/:C1 UNDEF. / A WORD :4243 :C2/:C3 B / C WORD :4445 :C4/:C5 D / E WORD :4647 :C6/:C7 F / G WORD :4849 :C8/:C9 H / I WORD :0000 :CA/:CB WORD :0000 :CC/:CD WORD :0000 :CE/:CF WORD :004A :D0/:D1 UNDEF. / J WORD :4B4C :D2/:D3 K / L WORD :4D4E :D4/:D5 M / N WORD :4F50 :D6/:D7 O / P WORD :5152 :D8/:D9 Q / R WORD :0000 :DA/:DB WORD :0000 :DC/:DD WORD :0000 :DE/:DF WORD :0000 :E0/:E1 WORD :5354 :E2/:E3 S / T WORD :5556 :E4/:E5 U / V WORD :5758 :E6/:E7 W / X WORD :595A :E8/:E9 Y / Z WORD :0000 :EA/:EB WORD :0000 :EC/:ED WORD :0000 :EE/:EF WORD :3031 :F0/:F1 0 / 1 WORD :3233 :F2/:F3 2 / 3 WORD :3435 :F4/:F5 4 / 5 WORD :3637 :F6/:F7 6 / 7 WORD :3839 :F8/:F9 8 / 9 WORD :0000 :FA/:FB WORD :0000 :FC/:FD WORD :0000 :FE/:FF END RD :797Amacro rje.lib=rje( d=sf.gen+sf.rtx+sf.ios+sf.iosd+sf.bsc+rje(l=rje)+rjed(l=rjed),l=rjel) 0 M: SET 1%#(1) IFT #(?)>1 M: SET 1%#(2);M: IFT #(?)>2 M: SET 1%#(3);M: IFT #(?)>3 M: SET 1%#(4);M: IFT #(?)>4 M: SET 1%#(5);M: IFT #(?)>5 M: SET 1%#(6);M: IFT #(?)>6 M: SET 1%#(7);M: IFT #(?)>7 M: SET 1%#(8);M: ENDC ENDC ENDC ENDC ENDC ENDC ENDC ENDC IFT #(0)=0 M: SET -M:-1 ENDC IFT #(0)>0 OR =M:,A ENDC IFF #(0)>0 AND =M:,A ENDC ENDM END EQU WRTENQ+1 OFFSET TO RELEASE LAST BUFFER SEGMENT ADDRESS RESEND EQU RELBUF+1 OFFSET TO RESEND LAST BUFFER SEGMENT ADDRESS RDINIT EQU RESEND+1 OFFSET TO READ INITIAL SEGMENT ADDRESS WRTEOT EQU RDINIT+1 OFFSET TO WRITE EOT SEGMENT ADDRESS WRTDCN EQU WRTEOT+1 OFFSET TO DISCONNECT SEG. ADDRESS WRTREIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII" IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII# IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII$ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII% IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII& IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe;760301064907760301064907810210170707e@760301064907760301064907810210170705e:' 760301064907760301064907760301064907e760301064907760301064907760301064907760301064907760301064907760301064907e8101222002440081012220064700810210170629eY8102101648342581021016483475810210170638e 8101211736205081012117362175810210170650( ) * + , - . / 0 . RJE ASMRJE JCLRJED MACIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII1 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII2 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII3 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII4 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII5 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII6 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII7 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII8 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII9 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII