IMD 1.16: 2/09/2008 12:40:47 84-93898-03 a000 f89803 qcd nuclues qcd source prt II    @0|)wwЀЀtQql)  " }gA `_l M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF181111617563304811116175633 811116175633F89803 VOL410T QCD   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_l M@iGyy GGG`HZ@ b G`^Y e IQ BBp@;:9 :7P@ G:پN 8!0. * C'xC# b# }B @0DAJL w+™ЀЀΖQA1"   i ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G9H@pܾrCHC C GTq` Lg"gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYS"iwvc Bc A@6<# Ic B# gIjHc r TITL NM4 4/10T QCD PART 2 84-93898-14A0 * * * * NM4 4/10T QCD PART 2 * * * * 84-93898-14-A0 * * * COPYRIGHT 1982 COMPUTER AUTOMATION INC. * TITL EXTERNAL LINKS NAM PART2 ABS PART1END TITL UNIMPLEMENTED INSTRUCTION TEST *********************************************************** * * ---------- UNIMPLEMENTED INSTRUCTION TEST ---------- * * THIS TEST EXECUTES EACH UNIMPLEMENTED INSTRUCTION * TO MAKE SURE THAT EACH WILL INVOKE AN UNIMPLEMENTED * INSTRUCTION TRAP. THE INSTRUCTION SKELETONS ARE * PROVICED IN A DATA TABLE (UITAB) * * THIS TEST USES THE FETCH MACHINE TYPE * INSTRUCTION (FMT) TO DETERMINE WHETHER * OR NOT THE OPTIONAL INSTRUCTION SET IS *  INSTALLED FOR A PARTICULAR MACHINE. IT * THEN DYNAMICALLY SELECTS WHICH INSTRUCTIONS * TO TEST AS UNIMPLEMENTED. * *********************************************************** PART2 EQU $ JMP UITST START TEST TITL UITABL EQU $ * UNUSED CODES WORD :0307 WORD :030B WORD :030E WORD :7600  WORD :0E0E WORD :0F15 WORD :0F25 WORD :0F45 WORD :0F85 WORD :0F0D WOR D :0F0F WORD :2F0E WORD :4F0E WORD :6F0E WORD :5C15 WORD :5C25 WORD :5C45 WORD :5C85 WORD :5C07 WORD :5C17 WORD :5C27 WORD :5C37 WORD :2600  WORD :4600 WORD :6600 * COBOL WORD :7C00 * LIST WORD  :1D00 * UIMASK EQU $ WORD :60F0 WORD :60F0 WORD :60F1 WORD :00FF WORD :60F0  WORD :60E2 WORD :60D2 WORD :60B2 WORD :6072 WORD :60F0 WORD :60F0 WORD :00F0 WORD :00F0 WORD :00F0 WORD :00E0 WORD :00D0 WORD :00B0 WORD :0070 WORD :00F0 WORD :00C0 WORD :00C0 WORD :00C0 WORD :00FF WORD :00FF WORD :00FF * WORD :00FF * WORD :60FF * UISIZE WORD $-UIMASK UICNT RES 1,0 LPOOL * TITL UITST EQU $ COPY DEMAND,A GET TEST SELECTIONS AND =2,A TEST BIT 1 JNE A,$+3 EXECUTE UNIMP. INSTR. TEST IF SET JMP *$+1 BIT NOT SET - SKIP TEST WORD R09001 COPY =2,A UNIMP. INSTR. TEST CODE JST SLVDSP JUMP TO CONSOLE DISPLAY ROUTINE * COPY =UITRAP,A COPY A,UNIMPT COPY =UIMASK,Y COPY =UITABL,X SUB =1,X SUB =1,Y COPY UISIZE,A NEG A,Q COPY Q,UICNT UITRP1 ADD =1,X ADD =1,Y COPY 0(X),Q COPY Q,UIOP UITRP2 COPY BITMSK,A AND 0(Y),A XNX A UIOP RES 1,0 NOP ERROR: DID,NOT,TAKE,TRAP UITRAP ENT SIN 1 RESET SIN COUNTER TO ALLOW POWER-FAIL TRAP COPY UIOP,Q ADD A,Q CSK Q,:85 NOP ERROR: DID,NOT,SAVE,CORRECT,INSTRUCTION IMS BITMSK COPY BITMSK,A JGE A,UITRP2 COPY =0,A DATA FOR DISPLAY JST SLVDSP JUMP TO CONSOLE DISPLAY ROUTINE COPY DELAY1,A DELAY CONSTANT IJNE A,$  DELAY FOR APPROX. .25 SEC COPY =2,A UNIMP. INSTR. TEST CODE JST SLVDSP JUMP TO CONSOLE DIAPLAY ROUTINE COPY =0,A COPY A,BITMSK IMS UICNT JMP UITRP1 * * OPTIONAL INSTRUCTIONS IF NOT IMPLEMENTED * FMT A CHECK FOR OPTIONAL AND =3,A INSTRUCTIONS JEQ A,$+2 IF YES, DO THE JUMP JMP R09001 * COPY =OPTRAP,A COPY A,UNIMPT SET INTERRUPT ROUTINE COPY =OPMASK,Y GET TOP OF MASK TABLE COPY =OPTABL,X GET TOP OF OP TABLE SUB =1,Y PREPARE FOR LOOP SUB =1,X PREPARE FOR LOOP COPY OPSIZE,A SET OP COUNT NEG A,Q COPY Q,OPCNT BACK2 ADD =1,X BUMP XREG ADD =1,Y BUMP YREG COPY 0(X),Q GET AN INSTRUCTION COPY Q,INSOP PUT IN TEST LOCATION BACK1 COPY BITMSK,A GET DON'T CARE COUNT AND 0(Y),A MASK DON'T CARE BITS COPY X,XTEMP COPY Y,YTEMP COPY =0,X COPY =0,Y COPY X,TEMP01 XNX A SET INSTRUCTION INSOP RE S 1 TEST LOCATION NOP ERROR: DID,NOT,TAKE,TRAP OPTRAP EQU $ ENT SIN 1 RESET SIN COUNTER TO ALLOW POWER-FAIL TRAP COPY INSOP,Q GET TRAP LOCATION ADD A,Q CSK Q,:85 COMPARE WITH TRAPPING INSTRUCTION NOP ERROR: DID,NOT,SAVE,CORRECT,INSTRUCTION COPY XTEMP,X COPY  YTEMP,Y IMS BITMSK BUMP DON'T CARE WORD COPY BITMSK,A JGE A,BACK1 COPY =0,A  COPY A,BITMSK RESET BIT MASK TO ZERO COPY =0,A DATA FOR DISPLAY JST SLVDSP JUMP TO CONSOLE DISPLAY ROUTINE COPY DELAY1,A DELAY CONSTANT IJNE A,$ DELAY FOR APPROX. .25 SEC COPY =2,A  UNIMP. INSTR. TEST CODE JST SLVDSP JUMP TO CONSOLE DISPLAY ROUTINE IMS OPCNT BUMP INSTRUCTION COUNT JMP BACK2 JMP R09001 DONE LPOOL TITL OPTABL EQU $ * * DBL REG SHIFTS WORD :2F00 WORD :4F00 WORD :6F00 WORD :2F0C WORD :4F0C WORD :6F0C *  SNGL REG SHIFTS WORD :0E00 WORD :0E0A * FLT PT WORD :030C WORD :5C00 WORD :5C04 * MLT WRD MEM REF WORD :2702 WORD :0703  WORD :0708 WORD :0704 OPMASK EQU $ * WORD :00FB WORD :00FB WORD :00FB WORD  :00F0 WORD :00F0 WORD :00F0 * WORD :60F8 WORD :60F0 * WORD :60F1 WORD :00F3 WORD :00F0 * WORD :40F0 WORD :00F0 WORD :60F7 WORD :60F3 OPSIZE EQU $ WORD OPSIZE-OPMASK BITMSK WORD :0000 OPCNT WORD :0000 DELAY1 WORD 0 R09001 EQU $ TITL REAL TIME CLOCK TEST ******************************************************* * * ---------- REAL TIME CLOCK TEST ---------- * * THIS TEST VERIFIES CORRECT OPERATION OF THE REAL TIME * CLOCK INCREMENT AND INTERRUPT. THE INCREMENT CELL IS * SET TO A 3 SECOND COUNT, AND IS ALLOWED TO INCREMENT * TO ZERO, WITH THE TEST CHECKING THE INCREMENTING * PROCESS. AS THE INCREMENT COUNT GOES TO ZERO, AN * INTERRUPT SHOULD OCCUR. * ******************************************************* N31000 EQU $  COPY DEMAND,A TEST SELECTION AND =4,A JNE A,$+3 IF BIT 2 SET, EXECUTE TEST JMP *$+1  IF BIT 2 RESET, SKIP TEST WORD N31040 POINTER TO END OF RTC TEST * COPY =:4,A RTC TEST CODE JST SLVDSP JUMP TO SLAVE CONSOLE DISPLAY ROUTINE COPY =:91,X RTC INCREMENT CELL LOCATION * COPY =N31025,A RTC INTERRUPT SERVICE ROUTINE COPY A,2(X) PUT IN :93 COPY STATSV,A NORMAL STATUS COPY A,S N31010 EQU $ COPY =:FF10,A DEC. -240. COUNT FOR INCREMENT CELL COPY A,0(X) THIS SHOULD GIVE A 2 SECOND WAIT COPY =:FF11,A VALUE FOR IMAGE COUNTER COPY A,COUNTA * SBIT 8,S ENABLE INTERRUPTS SBIT  5,S ENABLE RTC N31011 COPY =0,Q CLEAR DELAY COUNTER IMS COUNTA COMPARISON VALUE FOR INCREMENT CELL   NOP N31012 EQU $ IJEQ Q,N31013 INCREMENT DELAY COUNTER, JUMP IN EXPIRED COPY 0(X),A GET INCREMENT CELL CSK A,COUNTA HAS INCREMENT OCCURED YET ? NOP JMP N31012 NO, COUTINUE DELAY LOOP CSK  A,=0 HAS INCREMENT CELL GONE TO ZERO ? NOP JMP $+2 NO, OK JMP N31014 YES, ERROR *  JMP N31011 WAIT FOR NEXT INCREMENT * N31013 RBIT 5,S DISABLE RTC ERROR: TIMER,EXPIRED,BEFORE,INCREMENT,OCCURED JMP N31028 N31014 RBIT 5,S DISABLE RTC ERROR: INCREMENT,CELL,WENT,TO,ZERO,WITH,NO,INTERRUPT  JMP N31028 N31025 ENT INTERRUPT SERVICE ROUTINE COPY 0(X),A GET INCREMENT CELL CSK A,=0 NOP ERROR: INCREMENT,CELL,SHOULD,BE,0,ON,INTERRUPT COPY COUNTA,A JEQ A,$+2 ERROR: INCREMENT,CELL,SHOULD,HAVE,VALUE,IN,'COUNT' N31028 EQU $ RBIT 5,S DISABLE RTC SBIT 8,S ENABLE INTERRUPTS *  COPY =0,A VALUE FOR DISPLAY JST SLVDSP JUMP TO SAVE DISPLAY ROUTINE COPY DELAY1,A DELAY CONSTANT IJNE A,$ DELAY FOR APPROX. .25 SEC. * JMP N31000 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP N31029 JMP N31030 EXIT COUNTA RES 1,0 CHECK COUNT FOR INCREMENT CELL LPOOL *********************************************************************** * * RTC CONSISTANCY TEST * * THE RTC IS RUN FOR ABOUT 1/8 SECOND (16 TICS) AND * AN AVERAGE 2 TIC SOFTWARE COUNT IS TAKEN. A + AND - * 3% WINDOW IS CALCULATED ON THIS SOFTWQRE COUNT, AND * USED TO DETERMINE THE CONSISTENCE OF THE RTC OVER A * 4 SECOND SPAN * ************************************************************************ * N31030 EQU $ COPY =4,A RTC TEST CODE JST SLVDSP  JUMP TO SLAVE DISPLAY ROUTINE RBIT 4,S DISABLE CONSOLE INTERRUPT RBIT 8,S INHIBIT INTERRUPTS  COPY =:FFF7,A SET LOOP TO 9 TIMES COPY A,N3LOOP COPY =0,A CLEAR SOFTWARE COUNT COPY A,COUNTA N31031 COPY =:FFEC,A MINUS TWENTY TICS COPY A,0(X) STORE AT :91 COPY =N31032,A INTERRUPT RETURN  COPY A,2(X) STORE AT :93 SBIT 5,S ENABLE RTC SBIT 8,S START RTC IMS COUNTA  JMP $-1 ERROR: NO,INT.,OR,COUNT,OVERFLOW * N31032 ENT RBIT 8,S STOP RTC COPY 0(X),A CHECK TIC COUNT = 0 CSK A,=0 NOP ERROR: RTC,COUNT,CELL,NOT,=,0,AT,INTERRUPT COPY N3LOOP,A CSK A,=:FFF7 THROW AWAY FIRST NOP JMP $+3 COPY =0,A FIRST COPY A,COUNTA IMS N3LOOP FINISHED? JMP N31031 NO COPY COUNTA,A YES,AVERAGE SHIFT A,RA,3 DIVIDE BY 8 COPY A,LOW THIS IS A TWO TIC SOFTWARE AVERAGE SHIFT A,RA,5 A 6% WINDOW IS CALCULATED COPY A,Q ADD LOW,A COPY A,HIGH COPY LOW,A SUB Q,A COPY A,LOW * * SECOND PART OF TEST BEGINS HERE *  COPY =:FF10,A SET UP FOR 4 SECOND RUN COPY A,N3LOOP N31033 COPY =0,A COPY A,COUNTA COPY = :FFEC,A USE MINUS TWENTY AGAIN COPY A,0(X) STORE IN :91 COPY =N31034,A RTC INTERRUPT SERVICE ROUTINE LOCATION COPY A,2(X) STORE IN :93 SBIT 5,S ENABLE RTC SBIT 8,S START RTC IMS COUNTA JMP $-1 ERROR: NO,INTERRUPT,OR,COUNT,OVERFLOW * N31034 ENT RBIT 8,S STOP RTC COPY 0(X),A CHECK TIC COUNT = 0 CSK A,=0 NOP ERROR: RTC,COUNT,CELL,NOT,=,0,ON,INTERRUPT COPY N3LOOP,A CSK A,=:FF10 THROW AWAY FIRST NOP JMP $+2 JMP N31035 FIRST * COPY COUNTA,A  CSK A,HIGH DOES COUNT FIT IN WINDOW JMP $+3 NOP ERROR: COUNT,IS,ABOVE,LIMIT,-,RTC,PERIOD,TOO,HIGH CSK A,LOW ERROR: COUNT,IS,BELOW,LIMIT,-,RTC,PERIOD,TOO,LOW NOP N31035 EQU $ COUNT IS OK IMS N3LOOP ARE WE FINISHED ? JMP N31033 NO * JMP N31030 PATCH FOR LOOPING ORG $-1 JMP N31000 PATCH FOR LOOPING THROUGH ENTIRE RTC TEST ORG $-1 NOP OVERLAY WITH NOP JMP N31040 * HIGH RES 1,0 HIGH LIMIT LOW RES 1,0 LOW LIMIT N3LOOP RES 1,0 LOOP CONTROL LPOOL N31040 EQU $ TITL I/O TEST -- INITIALIZATION ******************************************************* * * ---------- I/O TEST ---------- * * THE I/O TEST (IOT) TESTS ALL INPUT / OUTPUT * FUNCTIONS OF THE PROCESSOR. IN ADDITION, IT * VERIFIES ALL SIGNALS ON THE MOTHERBOARD, * AND TESTS ALL PROCESSOR FUNCTIONS ASSOCIATED * WITH INTERRUPTS (IE INSTRUCTION EXECUTION * UNDER INTERRUPTS, AND INSTRUCTION NON- * INTERRUPTABILITY). * FOLLOWING ARE THE INDIVIDUAL TESTS IN IOT: * * 1. DEVICE ADDRESS FUNCTION CODE EXERCISE * 2. PROGRAMMED I/O INSTRUCTION TESTING * 3. I/O CLOCKS TESTING * 4. INTERRUPT INSTRUCTION TESTING * 5. AUTO I/O INSTRUCTION TESTING * 6. NON-INTERRUPTABILITY TESTING * 7. DMA TESTING * 8. POWER-FAIL TESTING * * NOTE - THIS TEST REQUIRES THAT THE I/O TEST * MODULE BE INSTALLED IN THE SYSTEM. * ******************************************************* * * DEVICE ADDRESS AND FUNCTION CODE EQUATES * DA0A EQU :50 DA0B EQU :58 DA0C EQU :60 DA15 EQU :A8 FC0 EQU 0 FC1 EQU 1 FC2 EQU 2 FC3 EQU 3 FC4 EQU 4 FC5 EQU 5 FC6  EQU 6 FC7 EQU 7 * * INITIALIZATION * IOT4 EQU $ G00000 EQU $ COPY DEMAND,A TEST SELECTION  AND =8,A TEST BIT 3 JEQ A,G00002 NOT SET - EXIT I/O TEST COPY =8,A I/O TEST CODE JST  SLVDSP JUMP TO SLAVE CONSOLE DISPLAY ROUTINE COPY =0,A IN :50,A CLSN =:AF,A TEST FOR TEST BOARD RESPONSE JMP G00009 EXECUTE I/O TEST G00002 JMP *$+1 WORD PART2END * * G00009 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY STATSV,A COPY A,S INITIALIZE STATUS TITL I/O TEST -- DAFC TESTING ************************************************** * * DEVICE ADDRESS / FUNCTION CODE TESTI NG * * THE FOLLOWING DEVICE ADDRESS /FUNCTION CODE * COMBINATIONS ARE TESTED * * DA0A FC0 * DA0A FC1 * DA0A FC2 * DA0B FC3 * DA0B FC4 * DA0B FC5 * DA0B FC6 *  DA0B FC7 * DA15 FC2 * * EACH OF THESE PAIRS IS DEFINED TO * CAUSE THE I/O TEST CARD TO RETURN THE * 1'S COMPLIMENT OF THE DAFC COMBINATION. * ************************************************** ****** * * DEVICE ADDRESS / FUNCTION CODE EXERCISE * ****** * * FIRST TEST DEVICE ADDRESS 0B, FUNCTION CODES 0-7 USING A REG * G01010 EQU $  COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY =0,X INDEX FOR IN INSTRUCTION COPY =:AF,Y INDEX FOR CLSN INSTRUCTION G01012 EQU $ COPY =0,A XNX X FUNCTION CODE IS DETERMINED BY X REG IN DA0A;FC0,A 'A' SHOULD BE 1'S COMPLIMENT OF DA&FC XNX Y CLSN =0,A VALUE FOR COMPARISON IS IN Y REG. JMP $+2 OK ERROR: DEVICE ADDR / FUNCTION CODE FAILURE * FC IS IN X REGISTER * COMPLIMENTED VALUE IS IN Y REGISTER * CLSN =7,X REACHED LAST FUNCTION CODE ? JMP G01015 YES, END REACHED - NEXT TEST ADD =1,X SUB =1,Y JMP G01012 LOOP TO CONTINUE * * NEXT TEST DEVICE ADDRESS 15, FUNCTION CODE 2 USING Q REG * G01015 EQU $ COPY =0,A IN DA15;FC2,Q 'Q' SHOULD BE 1'S COMPLIMENT OF DA&FC CLSN =:55,Q JMP $+2 ERROR: DEVICE ADDR / FUNCTION CODE FAILURE. * JMP G01010 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP JMP G02000 LPOOL TITL I/O TEST -- PROGRAMMED I/O TESTING ************************************************** * * OUT 4REG,DAFC G02000 * IN DAFC,4REG G02000 * SELP 4REG,DAFC G03000 * SST  DAFC G04000 * * IN AND OUT ARE TESTED WITH 4 REGISTERS AND * WITH 4 DATA PATTERNS (:FFFF, :AAAA, :5555, * :0000). DATA IS OUTPUT TO THE I/O TEST CARD * USING OUT, AND THEN READ BACK IN USING IN. * * SELP IS TESTED WITH ONLY THE A REGISTER * * SST IS TESTED FOR BOTH A TRUE AND A FALSE * SENSE RESPONSE. * ************************************************** ****** * * OUT 4REG,DAFC * IN DAFC,4REG * ****** G02000 EQU $ COPY =0,Q  INITIALIZE Q COPY PTFFFF,A INITIALIZE A OUT Q,DA15;FC0 WRITE DATA TO HOLDING REG IN DA15;FC0,A READ IT BACK CSK A,=0 NOP ERROR: DATA,BUS,FAILURE,--,A,SHOULD,=,0 * COPY PTAAAA,X INITIALIZE X OUT X,DA15;FC0 WRITE DATA TO HOLDING REG. IN DA15;FC0,Q READ IT BACK CSK Q,PTAAAA NOP  ERROR: DATA,BUS,FAILURE,--,Q,SHOULD,=,:AAAA COPY PT5555,Y INITIALIZE Y OUT Y,DA15;FC0 WRITE DATA TO HOLDING REG IN DA15;FC0,X READ IT BACK COPY X,Q CSK Q,PT5555 NOP ERROR: DATA,BUS,FAILURE,--,X,SHOULD,=,:5555 * COPY PTFFFF,A OUT A,DA15;FC0 WRITE DATA TO HOLDING REG. IN DA15;FC0,Y REA D IT BACK COPY Y,Q CSK Q,PTFFFF NOP ERROR: DATA,BUS,FAILURE,--,Y,SHOULD,=,:FFFF * JMP  G02000 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP ****** * * SELP 4REG,DAFC * ****** G03000 EQU $ COPY =0,Q SELP A,DA0B;FC6 INITIALIZE I/O MODULE COPY PT6666,A SELP A,DA15;FC7 WRITE DATA TO HOLDING REGISTER IN DA15;FC0,Q READ IT BACK CSK Q,PT6666 NOP ERROR: DATA,BUS,FAILURE,--,Q,SHOULD,=,:6666 ****** * * SST DAFC * ****** G04000 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SST DA15;FC1 TEST FOR I/O BOARD INSTALLED ERROR: SST,FAILED,--,SHOULD,SKIP SST :20 UNDEFINED DEVICE ADDRESS JMP $+2 ERROR: SST,FAILED,--,SHOULD,NOT,SKIP * JMP G03000 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP TITL I/O TEST -- I/O CLOCKS TESTING ************************************************** * * VERIFY I/O CLOCKS (IOCL AND CLK) AND CLOCK * SIGNAL ROUTING ON MOTHERBOARD. * ************************************************** G05000 EQU $ COPY =0,A SELP A,DA0B;FC6 INITIALIZE I/O MODULE SELP A,DA15;FC4 ENABLE I/O CLOCKS SST DA0A;FC0 TEST I/O CLOCK (IOCL) ERROR: I/O,CLOCK,(IOCL),NOT,RUNNING SST DA0A;FC1 TEST CLOCK (CLK) ERROR: CLOCK,(CLK),NOT,RUNNING SELP A,DA15;FC5 DISABLE I/O CLOCKS SST DA0A;FC0 TEST I/O CLOCK (IOCL) JMP $+2 OK ERROR: I/O,CLOCK,(IOCL),IS,STILL,RUNNING SST DA0A;FC1 TEST CLOCK (CLK) JMP $+2 ERROR: CLOCK,(CLK),IS,STILL,RUNNING * SELP A,DA0B;FC6 INITIALIZE I/O TEST MODULE JMP G05000 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP TITL I/O TEST -- INTERRUPT INSTRUCTION TESTING ******************************************************* * * JST  MEN AS INTERRUPT INSTRUCTION * JSK MEM AS INTERRUPT INSTRUCTION * NOP AS INTERRUPT INSTRUCTION * * INSTRUCTIONS ARE TESTED FOR DEFINED ASPECTS * OF OPERATION AS INTERRUPT INSTRUCTIONS. * JSK IS TESTED IN BOTH NORMAL OPERATION AND IN * TRAP OPERATION. THIS ALLOWS TESTING OF PARTICULAR * CHARACTERISTICS OF TRAP OPERATION WHEN CAUSED BY * AN INTERRUPT INSTRUCTION. * SIN IS TESTED FOR ABILITY TO INHIBIT INTERRUPTS. * ******************************************************* ****** * * TEST SIN FOR INTERRUPT INHIBIT * TEST JST AS INTERRUPT INSTRUCTION *  AND VERIFY INTERRUPT TO OCCUR * ****** G06000 EQU $ COPY =:94,Y CONSOLE INTERRUPT (SLAVE INTERRUPT) COPY JST1,A JST INSTRUCTION COPY A,0(Y) STORE IN INTERRUPT LOCATION COPY =G06003,A INTERRUPT SERVICE ROUTINE LOCATION COPY A,1(Y) RBIT 8,S DISABLE INTERRUPTS COPY =1,A COPY A,G06003 CLEAR SUBROUTINE RETURN POINTER SELP A,:F9 SET SLAVE INTERRUPT NOP NOP SST :F9 IS SLAVE INTERRUPT PENDING YET ? JMP $-1 NO, LOOP UNTIL READY SIN 2 SBIT 8,S ENABLE INTERRUPTS   NOP ADD =1,A THIS INSTRUCTION SHOULD EXECUTE BEFORE INTERRUPT G06002 ADD =1,A THIS INSTRUCTION SHOULD NOT EXECUTE RBIT 8,S DISABLE INTERRUPTS ERROR: INTERRUPT,DID,NOT,TAKE,PLACE JMP G06010 ERROR EXIT G06003 ENT CSK A,=2 NOP ERROR: SIN,ALLOWED,WRONG,NUMBER,OF,INSTRUCTIONS,TO,EXECUTE COPY S,A AND =:0100,A TEST BIT 8 JEQ A,$+2 ERROR: JST,FAILED,--,INT,BIT,OF,S,REG,WAS,NOT,RESET COPY  G06003,A FETCH SUBROUTINE RETURN POINTER CSK A,=G06002 COMPARE WITH EXPECTED VALUE NOP ERROR: JST,FAILED,--,STORED,WRONG,RETURN,POINTER JMP G06010 G06006 ENT ERROR: JST,FAILED,--,SHOULD,NOT,GET,EOB,INTERRUPT G06010 EQU $ JMP G06020 * * * IMS1 IMS $+1 JSK1 JSK *$+1 * * * LPOOL ****** * * JSK AS INTERRUPT INSTRUCTION * ****** G06020 EQU $ COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT COPY STATSV,A  COPY A,S INITIALIZE STATUS COPY JSK1,A JSK *$+1 INSTRUCTION COPY A,0(Y) STORE IN INTERRUPT LOCATION COPY =G06025,A INTERRUPT SERVICE ROUTINE LOCATION COPY A,1(Y) STORE AT INTERRUPT LOCATION COPY =:9C,X STACK EXCEPTION TRAP LOCATION COPY JST1,A JST *$+1 INSTRUCTION COPY A,2(X) STORE IN 3RD WORD OF TRAP COPY =G06028,A STACK EXCEPTION TRAP SERVICE ROUTINE LOC. COPY A,3(X) STORE IN 4TH WORD OF TRAP (:9F) COPY =STACKL,A STACK LIMIT COPY A,L LOAD L REGISTER COPY =STACKK,A STACK POINTER  COPY A,K LOAD K REGISTER COPY =1,A COPY A,STACK1 CLEAR STACK COPY A,0(X) CLEAR TRAP LOCATIONS COPY A,1(X) SIN 1 SELP A,:F9 SET SLAVE INTERRUPT NOP G06023 EQU $ ERROR: INTERRUPT,DID,NOT,OCCUR JMP G06029 ERROR EXIT * INTERRUPT SERVICE ROUTINE * G06025 EQU $ SIN 3  COPY STATSV,A FETCH VALUE FOR S REG. RBIT 8,A TURN OFF INT BIT EXCH A,S INITIALIZE STATUS AND SAVE PREVIOUS STATUS CSK A,STATSV COMPARE STATUS WITH EXPECTED VALUE NOP ERROR: JSK,FAILED,--,S,REG,WAS,ALTERED COPY K,A GET STACK POINTER CSK A,=STACK1 COMPARE WITH EXPECTED VALUE NOP ERROR: JSK,FAILED,--,K,CONTAINS,WRONG,VALUE COPY STACK1,A GET STORED,P,COUNTER CSK A,=G06023 COMPARE WITH EXPECTED VALUE NOP ERROR: JSK,FAILED,--,WRONG,VALUE,OF,P,SAVED,IN,STACK JMP G06029 EXIT * G06027 ENT  EOB INTERRUPT SERVICE ROUTINE ERROR: SHOULD,NOT,RECIEVE,EOB,INTERRUPT JMP G06029 * G06028 ENT  STACK EXCEPTION TRAP ROUTINE ERROR: UNEXPECTED,STACK,EXCEPTION,TRAP * G06029 JMP G06020 PATCH FOR LOOPING  ORG $-1 NOP OVERLAY WITH NOP JMP G06030 * * DATA * STACK RES 8,0 STACKL EQU STACK STACK2 EQU STACK+6 STACK1 EQU STACK+7 STACKK EQU STACK+8 * * * LPOOL ****** * * JSK AS INTERRUPT INSTRUCTION * WITH FORCED STACK OVERFLOW TRAP * ****** G06030 EQU $ COPY =0,A SELP A,:F9 RESET SLAVE INTE RRUPT SBIT 8,S ENABLE INTERRUPTS COPY =G06035,A INTERRUPT SERVICE ROUTINE LOCATION COPY A,1(Y)  COPY =G06038,A STACK TRAP SERVICE ROUTINE LOCATION COPY A,3(X) STORE IN 4TH WORD OF TRAP (:8F) COPY  =STACKL,A STACK LIMIT COPY A,L LOAD L REGISTER COPY =STACK1,A STACK POINTER COPY A,K LOAD K REGISTER COPY =1,A COPY A,STACK2 CLEAR STACK COPY A,0(X) CLEAR TRAP LOCATIONS COPY A,1(X) SIN 1 SELP A,:F9 SET SLAVE INTERRUPT NOP G06033 EQU $ ERROR: INTERRUPT,DID,NOT,OCCUR JMP G0603A ERROR EXIT * * TRAP SERVICE ROUTINE * * * FIRST CHECK THAT TRAP EXECUTION AUTOMATICALLY DOES A SIN 15 * G06038 ENT COPY JST1,A JST *$+1 COPY A,0(Y) STORE AT INTERRUPT LOCATION COPY =G06039,A TRAP SERVICE ROUTINE ADDRESS COPY A,1(Y) STORE AT INTERRUPT LOCATION COPY STATSV,Q FETCH INITIAL VALUE FOR S REG EXCH Q,S RESTORE S AND SAVE PREVIOUS STATUS COPY =0,A IJNE A,$ WAIT FOR 2ND INTERRUPT ERROR: 2ND,INTERRUPT,DID,NOT,OCCUR JMP G06034 ERROR EXIT G06039 ENT CSK A,=8 NOP ERROR: TRAP,EXECUTION,DID,NOT,AUTOMATICALLY,DO,SIN,15 * * CHECK POST-TRAP STATUS * G06034 TBIT 8,Q COPY INT BIT TO OV JF OV,$+2 TEST INT BIT ERROR: JST,AT,TRAP,LOCATION,SHOULD,RESET,INT,BIT SBIT 8,Q  SET INT BIT CSK Q,STATSV NOP ERROR: JSK,AT,INTERRUPT,LOCATION,OR,JST,AT,TRAP,LOCATION *  ALTERED STATUS (OTHER THAN INT BIT) * * CHECK POST TRAP POINTERS * COPY K,A GET STACK POINTER  CSK A,=STACK2 COMPARE WITH EXPECTED VALUE NOP ERROR: JSK,FAILED,--,K,CONTAINS,WRONG,VALUE COPY STACK2,A GET STORED P COUNTER CSK A,=G06033 COMPARE WITH EXPECTED VALUE NOP ERROR: JSK,FAILED,--,WRONG,VALUE,OF,P,SAVED,IN,STACK COPY 0(X),A FETCH 1ST WORD OF TRAP (:9C) CSK A,=G06035 SHOULD BE EFFECTIVE ADDRESS OF JSK INST NOP ERROR: LOC.,POINTER,AT,TRAP,LOADED,WITH,WRONG,VALUE COPY 1(X),A FETCH 2ND WORD OF TRAP (:9D) CSK A,JSK1 SHOULD BE JSK INSTRUCTION NOP ERROR: WRONG,INSTRUCTION,STORED,AT,TRAP,LOC.  COPY G06038,A GET TRAP SERVICE ROUTINE RETURN POINTER CSK A,=G06035 SHOULD BE EFFECTIVE ADDRESS OF JSK INST.  NOP ERROR: WRONG,RETURN,POINTER,WAS,STORED,AT,G06038 JMP G0603A * G06035 EQU $ INTERRUPT SERVICE ROUTINE RBIT 8,S DISABLE INTERRUPTS ERROR: JSK,FAILED,--,SHOULD,TAKE,TRAP JMP G0603A ERROR EXIT * G06037 ENT EOB INTERRUPT SERVICE ROUTINE ERROR: SHOULD,NOT,GET,EOB,INTERRUPT * G0603A EQU $ JMP G06030 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP * COPY =SET1,A UNEXPECTED STACK TRAP SERVICE ROUTINE COPY A,3(X) STORE AT 4TH WORD OF TRAP JMP G06050 LPOOL 8 ****** * *  TEST THAT XA IS FORCED ON TEMPORARILY * BY EXECUTION OF AN INTERRUPT INSTRUCTION * ****** G06050 EQU $ COPY  =0,A SELP A,:F9 RESET SLAVE INTERRUPT SBIT 8,S ENABLE INTERRUPTS COPY JST1,A JST *$+1  COPY A,0(Y) STORE AT INTERRUPT LOCATION COPY L8002,A ADDRESS OF IMS COUNT CELL (:8001) COPY A,1(Y) * SBIT 6,S SET XA BIT COPY =0,A COPY A,2 CLEAR LOCATION 2 COPY A,*L8002 CLEAR LOCATION :8002 COPY JMP2,A JMP *$-1 INSTRUCTION COPY A,3 STORE IN LOCATION 3 COPY A,*L8003 STORE IN LOCATION :8003 * RBIT 6,S RESET XA BIT COPY =1,A SELP A,:F9 SET SLAVE INTERRUPT NOP COPY 2,A GET CONTENTS OF LOCATION 2 CSK A,=0 SHOULD BE 0 NOP JMP $+2  ERROR JMP $+3 * ERROR: LOCATION,2,ALTERED,--,XA,WAS,NOT,FORCED,ON JMP G08000 * SBIT 6,S TURN ON XA BIT COPY *L8002,A FETCH IMS COUNT CELL (:8002) JNE A,$+2 ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08000 L8002 WORD :8002 L8003 WORD :8003 JMP2 JMP *$-1 LPOOL TITL I/O TEST -- NON-INTERRUPTABILITY TESTING ********************************************* * * NON-INTERRUPTABILITY TESTING * * JST MEM * JSK MEM * PUSH VAL * POP * SBIT 8,S * CBIT 8,S * COPY 8REG,S * XNX 4REG *  UIS * * ALL INSTRUCTIONS ARE TESTED FOR BEING * NON-INTERRUPTABLE. THE NON-INTERRUPTABILITY * OF STATUS REGISTER BIT CHANGE INSTRUCTIONS * IS TESTED ONLY WHEN THE INT BIT IS CHANGED. * THE NON-INTERRUPTABILITY TESTING OF XNX *  REFERES TO TESTING THAT XNX DOES NOT ALTER * THE NON-INTERRUPTABILITY OF A NON-INTERRUPTABLE * INSTRUCTION WHICH IT INDEXES. * ******************************************************* ****** * * JST MEM AS NON-INTRUPTABLE INSTRUCTION * ****** G08000 COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT COPY STATSV,A RESTORE STATUS COPY A,S COPY JST1,A JST *$+1 COPY A,0(Y) STORE AT INTERRUPT LOCATION COPY =G08007,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(Y) COPY =1,A SIN 2 SELP A,:F9 SET SLAVE INTERRUPT  NOP JST G08004 RBIT 8,S ERROR: JST,FAILED,--,DID,NOT,JUMP JMP G08009 ERROR EXIT G08004 ENT COPY =1,A NOP NOP TO ALLOW INTERRUPT RBIT 8,S ERROR: INTERRUPT,DID,NOT,OCCUR  JMP G08009 ERROR EXIT G08007 ENT INTERRUPT SERVICE ROUTINE JNE A,$+2 ERROR: JST,IS,INTERRUPTABLE G08009 JMP G08000 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP JMP G08020 LPOOL ****** * * JSK MEM AS NON-INTERRUPTABLE INSTRUCTION * ****** G08020 EQU $ COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT COPY STATSV,A COPY A,S INITIALIZE STATUS COPY =G08026,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(Y) STORE AT INTERRUPT LOCATION COPY =:9C,X STACK TRAP LOCATION COPY =G08028,A TRAP SERVICE ROUTINE ADDRESS COPY A,3(X) STORE IN 4TH WORD OF TRAP COPY  =STACCL,A STACK LIMIT COPY A,L LOAD L REGISTER COPY =STACCK,A STACK POINTER COPY A,K LOAD K REGISTER COPY =1,A SIN 2 SELP A,:F9 SET SLAVE INTERRUPT NOP JSK G08024 SHOULD BE NON-INTERRUPTABLE RBIT 8,S ERROR: NO,JSK JMP G08029 ERROR EXIT G08024 EQU $ COPY  =1,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08029 ERROR EXIT G08026 ENT INTERRUPT SERVICE ROUTINE JNE A,$+2 ERROR: JSK,IS,INTERRUPTABLE JMP G08029 EXIT G08028 EQU $ STACK TRAP SERVICE ROUTINE SIN  1 RBIT 8,S DISABLE INTERRUPTS ERROR: UNEXPECTED,STACK,OVERFLOW,TRAP G08029 JMP G08020 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP ****** * * PUSH VAL AS NON-INTERRUPTABLE INSTRUCTION * ****** G08040 EQU $ COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT COPY STATSV,A COPY  A,S INITIALIZE STATUS COPY =G08046,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(Y) STORE AT INTERRUPT LOCATION COPY =G08048,A STACK TRAP SERVICE ROUTINE ADDRESS COPY A,3(X) STORE IN 4TH WORD OF TRAP (:9F)  COPY =STACCL,A STACK LIMIT COPY A,L INITIALIZE L REGISTER COPY =STACCX,A STACK POINTER COPY A,K INITIALIZE K REGISTER COPY =1,A SIN 2 SELP A,:F9 SET SLAVE INTERRUPT NOP  PUSH 0 SHOULD BE NON-INTERRUPTABLE COPY =1,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP  NOP TO ALLOW INTERRUPT RBIT 8,S DISABLE INTERRUPTS ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08049 ERROR EXIT G08046 ENT INTERRUPT SERVICE ROUTINE JNE A,$+2 ERROR: PUSH,IS,INTERRUPTABLE  JMP G08049 G08048 EQU $ STACK OVERFLOW TRAP ROUTINE SIN 1 RBIT 8,S ERROR: UNEXPECTED,STACK,OVERFLOW,TRAP * G08049 JMP G08040 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP * COPY =LIGHTS,A UNEXPECTED STACK TRAP ROUTINE ADDR. COPY A,3(X) STORE IN 4TH WORD OF TRAP ****** * * POP  AS INTERRUPT INSTRUCTION * ****** G08050 EQU $ COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT  COPY STATSV,A COPY A,S INITIALIZE STATUS COPY =G08056,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(Y) STORE AT INTERRUPT LOCATION COPY =STACCL,A STACK LIMIT COPY A,L INITIALIZE L REGISTER  COPY =STACC1,A STACK POINTER COPY A,K INITIALIZE K REGISTER COPY STATSV,A INITIALIZE STACK  COPY A,STACC1+1 COPY =1,A COPY A,STACC1+2 * SIN 2 SELP A,:F9 SET SLAVE INTERRUPT  NOP POP COPY =1,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT  RBIT 8,S DISABLE INTERRUPTS ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08059 ERROR EXIT G08056 ENT   INTERRUPT SERVICE ROUTINE JNE A,$+2 ERROR: POP,WAS,INTERRUPTED * G08059 JMP G08050 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP JMP G08060 * STACC RES 13,0 STACCL EQU STACC STACC1 EQU STACC+7 STACCK EQU STACC+8 STACCX EQU STACC+13 LPOOL ****** * * SBIT 8,S AS NON-INTERRUPTABLE INSTRUCTION * ****** G08060 EQU $ COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT COPY STATSV,A COPY A,S INITIALIZE STATUS RBIT 8,S DISABLE INTERRUPTS COPY =G08066,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(Y) STORE AT INTERRUPT LOCATION COPY =1,A SELP A,:F9 SET SLAVE INTERRUPT  NOP SBIT 8,S SHOULD BE NON-INTERRUPTABLE COPY =1,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S DISABLE INTERRUPTS ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08069 ERROR EXIT G08066 ENT INTERRUPT SERVICE ROUTINE JNE A,$+2 ERROR: SBIT,IN,S,IS,INTERRUPTABLE G08069 JMP G08060 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP ****** * * CBIT 8,S AS NON-INTERRUPTABLE INSTRUCTION * ****** G08070 EQU $ COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT COPY STATSV,A COPY A,S INITIALIZE STATUS RBIT 8,S DISABLE INTERRUPTS COPY =G08076,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(Y) STORE AT INTERRUPT LOCATION COPY =1,A SELP A,:F9 SET SLAVE INTERRUPT NOP CBIT 8,S SHOULD BE NON-INTERRUPTABLE COPY =0,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S ERROR: INTERRUPT DID,NOT,OCCUR JMP G08079 G08076 ENT INTERRUPT SERVICE ROUTINE JEQ A,$+2 ERROR: CBIT,IN,S,IS,INTERRUPTABLE G08079 JMP G08070 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP ****** * *  COPY A,S AS NON-INTERRUPTABLE INSTRUCTION * ****** G08080 EQU $ COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT COPY A,S INITIALIZE STATUS COPY =G08086,A INTERRUPT SERVICE ROUTINE COPY A,1(Y)  STORE AT INTERRUPT LOCATION COPY =1,A SELP A,:F9 SET SLAVE INTERRUPT NOP COPY STATSV,A  COPY A,S SHOULD BE NON-INTERRUPTABLE COPY =0,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP  NOP TO ALLOW INTERRUPT RBIT 8,S DISABLE INTERRUPTS ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08089 ERROR EXIT G08086 ENT INTERRUPT SERVICE ROUTINE JEQ A,$+2 ERROR: COPY,TO,S,IS,INTERRUPTABLE G08089 JMP G08080 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP ****** * * XNX 4REG AS NON-INTERRUPTABLE INSTRUCTION * ****** G08090 EQU $ COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT COPY STATSV,A COPY A,S INITIALIZE STATUS COPY =G08096,A INTERRUPT SERVICE ROUTINE ADDRESS   COPY A,1(Y) COPY =0,Q COPY =1,A SIN 1 SELP A,:F9 SET SLAVE INTERRUPT XNX  Q JST G08094 SHOULD BE NON-INTERRUPTABLE RBIT 8,S ERROR: JST,FAILED,--,DID,NOT,JUMP JMP  G08099 ERROR EXIT G08094 ENT COPY =0,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S ERROR: INTERRUPT,DID,NOT,OCCUR JMP G08099 ERROR EXIT G08096 ENT INTERRUPT SERVICE ROUTINE JEQ A,$+2 ERROR: JST,AFTER,XNX,IS,INTERRUPTABLE G08099 JMP G08090 PATCH FOR LOOPING  ORG $-1 NOP OVERLAY WITH NOP ****** * * UIS AS NON-INTERRUPTABLE INSTRUCTION * ****** G080A0 EQU $ COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT COPY STATSV,A COPY A,S  INITIALIZE STATUS COPY =G080A6,A INTERRUPT SERVICE ROUTINE ADDRESS COPY A,1(Y) COPY =1,A SIN 2 SELP A,:F9 SET SLAVE INTERRUPT NOP UIS SHOULD BE NON-INTERRUPTABLE COPY =0,A COPY SHOULD EXECUTE BEFORE INTERRUPT NOP NOP TO ALLOW INTERRUPT RBIT 8,S ERROR: INTERRUPT,DID,NOT,OCCUR JMP G080A9 ERROR EXIT G080A6 ENT INTERRUPT SERVICE ROUTINE JEQ A,$+2  ERROR: UIS,IS,INTERRUPTABLE G080A9 JMP G080A0 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WITH NOP * COPY =0,A SELP A,:F9 RESET SLAVE INTERRUPT COPY PT8000,A IJNE A,$ DELAY  JMP PART2END LPOOL PART2END EQU $ SAVE END O ALLOW INTERRUPT RBIT 8,S ERROR: INTERRUPT,DID,NOT,OCCUR JMP G080A9 ERROR EXIT G080A6 ENT INTERRUPT SERVICE ROUTINE JEQ A,$+2  ERROR: UIS,IS,INTERRUPTABLE G080A9 JMP G080A0 PATCH FOR LOOPING ORG $-1 NOP OVERLAY WIT TITL NM4 4/10T QCD NUCLEUS 84-93898-12A0 TITL TITLE PAGE * * * * NM4 4/10T QCD NUCLEUS * * * *  84-93898-12-A0 * * * COPYRIGHT 1982 COMPUTER AUTOMATION INC. * TITL EXTERNAL LINKS * * EXTERNAL LINKER "LINKS" * EXTR QCDEND END OF QCD DIAGNOSTIC NAM COUNT1 NAM COUNT2 NAM COUNT3 NAM COUNT4 NAM PUPCTH NAM PDNCTH NAM PDNCT1 NAM PDNCT2 NAM PDNCT3 NAM PDNCT4 NAM  INIT1 NAM INIT2 NAM SLINSP NAM SLCTRL TITL DATA AND TEMP LOCATIONS * * DATA AND TEMP LOCATIONS USED BY DIAGNOSTIC * ABS :00 * RES 2,0 DEBUG LINK * CDRHLD RES 1,0 HOLDS VALUE TO BE OUTPUT TO CDR BY HOST TEMP01 RES 1,0 TEMP02 RES 1,0 TEMP RES 4,0 4 PUBLIC MEMORY TEMP CELLS ATEMP RES 1,0 XTEMP RES  1,0 QTEMP RES 1,0 YTEMP RES 1,0 KTEMP RES 1,0 LTEMP RES 1,0 PT00FF WORD :00FF DV3FF0 WORD :3FF0 DV3FF1 WORD :3FF1 DV3FF2 WORD :3FF2 PT5555 WORD :5555 DV5555 EQU PT5555 PT55AA WORD :55AA PT6666 WORD :6666 PT7FFF WORD :7FFF PT8000 WORD :8000 PTAA55 WORD :AA55 DVAAAA EQU PTAAAA PTAAAA WORD :AAAA PTF0F0 WORD :F0F0 PTFFFE WORD :  FFFE PTFFFF WORD :FFFF DVFFFF EQU PTFFFF STATSV WORD :0150 4/10T STATUS STHOST WORD :1150 HOST STATUS PCOUNT RES 1,0 PART 1 SECTION COUNTER COUNT1 RES 1,0 4/10T #1 PASS COUNTER COUNT2 RES 1,0 4/10T #2 PASS COUNTER COUNT3 RES 1,0 4/10T #3 PASS COUNTER COUNT4 RES 1,0 4/10T #4 PASS COUNTER DEMAND RES 1,0 TEST SELECTIONS DEFAULT WORD :F00F DEFAULT DEVICE ADDRESS & TEST PRAMS. JMP1 WORD :9F80 JMP *$+1 RELATIVE JST1 WORD :BF80 JST *$+1 RELATIVE HLT1 HLT HALT SLAVES RES 1,0 NUMBER OF 4/10T'S IN SYSTEM PUPCTH RES  1,0 HOST POWER-UP COUNT PDNCTH RES 1,0 HOST POWER-DOWN COUNT PDNCT1 RES 1,0 4/10T #1 POWER-DOWN COUNT PDNCT2 RES 1,0 4/10T #2 POWER-DOWN COUNT PDNCT3 RES 1,0 4/10T #3 POWER-DOWN COUNT PDNCT4 RES 1,0 4/10T #4 POWER-DOWN COUNT SLVNUM RES 1,0 CURRENT 4/10T NUMBER DABASE RES 1,0 DEVICE ADDRESS BASE ENDQCD WORD QCDEND END OF QCD * SCIR WORD :8100 SCDR WORD :8101 SCMAR WORD :8102 * * SLAVE CONTROL INSTRUCTION SKELETONS * OSDRI OSCDR A OUTPUT FROM SLAVE REG. TO SLAVE CONTROL DATA REG ISDRI ISCDR A INPUT TO SLAVE REG. FROM SLAVE CONTROL DATA REG. OMSDRI OMSCDR . OUTPUT FROM MEMORY TO SLAVE CONTROL DATA REG. IMSDRI IMSCDR . INPUT TO MEMORY FROM SLAVE CONTROL DATA REG. STOPI STOP . STOP INSTRUCTION SSTPI SSTEP . SINGLE STEP STARTI START . START ISDRPI ISCDR P 'INPUT FROM SLAVE DATA REGISTER TO P' INSTR. OSDRPI OSCDR P 'OUTPUT P TO SLAVE DATA REG.' INST. TITL "SLVDSP" SUBROUTINE * * SLAVE ROUTINE TO INSERT HEX DIGIT FROM A REG INTO * PROPER DIGIT POSITION OF CONSOLE DISPLAY VALUE * HOLDER (CDRHSL), TO BE OUTPUT TO CDR BY HOST. * * INPUT: HEX DIGIT IN BITS 0-3 OF A REG. * SLAVE NUMBER IN 'SLVNUM'. * * OUTPUT: HEX DIGIT TO ONE POSITION OF 'CDRHLD': * SLAVE 0 BITS 00-03 *  SLAVE 1 BITS 04-07 * SLAVE 2 BITS 08-11 * SLAVE 3 BITS 12-15 * ****************************** * * NOTE: THE STARTING ADDRESS OF THIS ROUTINE MUST BE =< :003F * ****************************** * SLVDSP ENT COPY X,XTEMP SAVE X COPY Q,QTEMP SAVE Q COPY SLVNUM,X CURRENT SLAVE NUMBER (SLVNUM) --> X XNX X INDEX MEMORY LOCATION COPY DSPINS,Q GET INSTRUCTION FOR LOCATING DISPLAY DATA COPY  Q,$+1 STORE INSTRUCTION FOR EXECUTION RES 1,0 LOCATE DISPLAY DATA TO PROPER HEX DIGIT LOCATION PNX  MAKE A PUBLIC ACCESS COPY CDRHLD,Q LOAD CONSOLE DATA REG VALUE XNX X INDEX MEMORY LOCATION AND DSPMSK,Q MASK OUT CURRENT DISPLAY POSITION OR A,Q OR IN NEW DISPLAY DIGIT PNX MAKE A PUBLIC ACCESS COPY Q,CDRHLD STORE CONSOLE WORD REG VALUE COPY QTEMP,Q RESTORE Q COPY XTEMP,X RESTORE X JMP *SLVDSP RETURN THROUGH SLVDSP * DSPINS EQU $ TABLE OF DISPLAY LOCATING INSTRUCTIONS NOP SLAVE 0 - SHIFT 0 SHIFT A,LO,4 SLAVE 1 - SHIFT 4 SHIFT A,LO,8 SLAVE 2 - SHIFT 8 SHIFT A,LO,12 SLAVE 3 -  SHIFT 12 * DSPMSK EQU $ TABLE OF MASKS FOR CONSOLE DISPLAY DIGITS WORD :FFF0 SLAVE 0 - MASK OUT DIGIT 0 WORD :FF0F SLAVE 1 - MASK OUT DIGIT 1 WORD :F0FF SLAVE 2 - MASK OUT DIGIT 2 WORD :0FFF SLAVE 3 - MASK OUT DIGIT 3 TITL * * HOST CONSOLE INTERRUPT SERVICE ROUTINE (STOP ALL SLAVES) * SLVHLT ENT SIN  2 DISABLE INTERRUPTS OUT Q,1 RESET CONSOLE INTERRUPT COPY STOPI,Q STOP INSTRUCTION COPY Q,*SCIR STORE IN SLAVE INSTRUCTION REGISTER COPY DABASE,X GET DEVICE ADDRESS BASE COPY =1,Q DATA FOR SELP COPY =4,A 4 SLAVES MAX. SLVHLT1 XNX X INDEX NEXT SELP Q,2 STOP SLAVE SUB =:10,X GENERATE NEXT ADDRESS IJNE A,SLVHLT1 DO NEXT HLT TITL INTERRUPT AND TRAP VECTORS * * INTERRUPT AND TRAP VECTORS * * * POWER-UP VECTOR * ABS :80 JST *$+1 WORD POWUP * * UNIMPLEMENTED INSTRUCTION TRAP VECTOR * ABS :84 UNTNTP RES  2,0 JST *$+1 UNIMPT WORD UIT1 * * UNINSTALLED MEMORY TRAP VECTOR * UNMEMT RES 2,0 JST *$+1 WORD UMT1 * * POWER-DOWN TRAP VECTOR * ABS :8C RES 1,0 RES 1,0 JST *$+1  WORD PDNHST REPLACED BY 'WORD PDNSLV' FOR SLAVE POWER-DOWN * * REAL TIME CLOCK INTERRUPT CELLS * NOP RTCTIN RES 1,0 RTC TIMING CELL JST *$+1 RTC TIMING OVERFLOW VECTOR RTCPTR RES 1,0 * *  HOST CONSOLE INTERRUPT VECTOR * JST *$+1 WORD SLVHLT RES 1,0 RES 1,0 * * CHARACTER / NUMERIC TRAP VECTOR * RES 2,0 JST *$+1 CNJMP WORD AET2 * * STACK EXCEPTION TRAP VECTOR * RES 2,0 JST *$+1 SEJMP WORD SET1 * * USER TRAP VECTOR * RES 2,0 JMP 0(Y) HLT * * SYSTEM TRAP * RES 2,0 JMP 0(Y) HLT * * ARITHMETIC EXCEPTION TRAP VECTOR * RES 2,0 JST *$+1 WORD AET1 * * HOST INTERRUPT FROM SLAVE * HSTINT JMP *$+1 WORD CONT1 TITL POWER-DOWN ROUTINES * * HOST POWER-DOWN ROUTINE * PDNHST ENT HOST POWER-DOWN ROUTINE IMS PDNCTH INCREMENT HOST POWER-DOWN COUNT COPY =11,A DELAY COUNT JNED A,$ EXECUTE DELAY SIN 15 SIN SHOULD EXPIRE AT HLT COPY =13,A DELAY COUNT JNED A,$ EXECUTE DELAY  HLT * * SLAVE POWER-DOWN ROUTINE * PDNSLV ENT SIN 5 COPY =PDNCT1,X POINTER TO SLAVE 0 POWER-DOWN COUNT IN PUB. MEM. ADD SLVNUM,X ADD OFFSET FOR SLAVE NUMBER PNX MAKE A PUBLIC ACCESS IMS 0(X)  INCREMENT CURRENT SLAVE POWER-DOWN COUNT HLT TITL UNEXPECTED TRAP SERVICE ROUTINES * * UNEXPECTED TRAP SERVICE ROUTINES * UMT1 ENT JST LIGHTS HLT UNEXPECTED UNINSTALLED MEMORY TRAP * UIT1 ENT JST LIGHTS HLT UNEXPECTED UNIMPLEMENTED INSTRUCTION TRAP * AET1 ENT JST LIGHTS HLT  UNEXPECTED DIVIDE / FLOATING POINT TRAP * AET2 ENT JST LIGHTS HLT UNEXPECTED CHARACTER / NUME RIC TRAP * SET1 ENT JST LIGHTS HLT UNEXPECTED STACK EXCEPTION TRAP * * ROUTINE TO DISPLAY UNEXPECTED TRAP CODE * LIGHTS ENT COPY =:A,A DISPLAY CODE FOR UNEXPECTED TRAP JST SLVDSP CALL SLAVE CONSOLE DISPLAY ROUTINE JMP *LIGHTS RETURN TITL POWER-FAIL SERVICE ROUTINES * * HOST POWER-UP ROUTINE * POWUP ENT SIN 15 DISABLE INTERRUPTS, POWER DOWN TRAP COPY PDNCTH,A HOST POWER-DOWN COUNT JNE A,POWUP1 IF NON-ZERO, GO TO POWER-FAIL START-UP JMP INIT1 GO TO INITIAL START-UP * * HOST POWER-FAIL START-UP * POWUP1 EQU $ COPY STHOST,A COPY A,S INITIALIZE STATUS UIS . DISABLE INTERRUPTS FROM SLAVES IMS PUPCTH INCREMENT HOST POWER-UP COUNT COPY PUPCTH,A LOAD HOST POWER-UP COUNT SUB PDNCTH,A SUBTRACT HOST POWER-DOWN COUNT JEQ A,$+4 JUMP IF HOST POWER UP & DOWN COUNTS EQUAL COPY HLT1,A HALT INSTRUCTION COPY A,:80 STORE AT POWER-UP LOCATION HLT HOST POWER UP & DOWN NOT EQUAL COPY A02PNT,A SLAVE STARTING ADDRESS COPY A,*SCDR STORE IN SLAVE DATA REGISTER COPY =0,A COPY A,SLVNUM INITIALIZE CURRENT SLAVE NUMBER COPY A,CDRHLD CLEAR CONSOLE DATA REG OUTPUT VALUE COPY DABASE,X INITIALIZE DEVICE ADDRESS INDEX POWUP2 EQU $ COPY SLVNUM,Q CURRENT SLAVE NUMBER XNX Q INDEX MEMORY LOCATION COPY PDNCT1,A POWER-DOWN COUNT FOR CURRENT SLAVE SUB PDNCTH,A SUBTRACT HOST POWER-DOWN COUNT  JEQ A,POWUP3 POWER-DOWN COUNTS MATCH -- JUMP TO START SLAVE XNX Q INDEX MEMORY LOCATION IMS PDNCT1 INCREMENT CURRENT SLAVE POWER-DOWN COUNT * POWUP3 COPY ISDRPI,A 'INPUT FROM SLAVE DATA REG. TO P' INST. COPY A,*SCIR STORE IN SLAVE INSTR. REG. JST DOIT MAKE SLAVE DO IT HLT TIMED OUT COPY STARTI,A START INSTRUCTION COPY A,*SCIR STORE IN SLAVE INSTR. REG JST DOIT MAKE SLAVE DO IT HLT TIMED OUT COPY CDRHLD,A GET VALUE FOR CONSOLE DATA REG SELP A,4 OUTPUT TO CONSOLE DATA REG POWUP4 EQU $ IMS SLVNUM INCREMENT CURRENT SLAVE NUMBER SUB =:10,X MODIFY SLAVE DEVICE ADDRESS INDEX JNED Y,POWUP2 DECREMENT SLAVE COUNTER -- JUMP IF NOT EXP. JMP CONT1 JUMP TO PUBLIC MEMORY LOCK-OUT ROUTINE TITL START-UP LOCATIONS * * THE FOLLOWING TWO LOCATIONS ARE LOADED IN PART1 * A01PNT RES 1 POINTER TO INITIAL START-UP LOCATION (A01000) A02PNT RES 1 POINTER TO POWER-FAIL START-UP LOCATION (A02000) TITL INITIAL STARTUP ROUTINE * * INITIAL STARTUP ROUTINE * ABS :110 INIT1 JMP $+2 DEFAULT ALL INIT2 JMP INIT3 INPUT PARAMETERS COPY DEFAULT,A GET DEFAULT DEVICE ADDRESS & PRAMS. JMP $+2 CONTINUE INIT3 IN 4,A GET TEST PARAMETERS COPY STHOST,Q GET HOST STATUS COPY Q,S SET S REG. COPY A,DEMAND STORE TEST PARAMETERS SHIFT A,RO,4 STRIP TO # OF SLAVES COPY A,Y LOAD # OF SLAVES IN Y SUB =1,Y -- MODIFY # AND =3,Y -- OF SLAVES COPY Y,SLAVES STORE NUMBER SHIFT A,RO,4 GET DEVICE ADDRESS COPY A,DABASE STORE IT COPY A,X PUT INTO X REG. COPY =0,A -- COPY A,PUPCTH -- CLEAR COPY A, PDNCTH -- POWER-UP COPY A,PDNCT1 -- AND COPY A,PDNCT2 -- POWER-DOWN COPY A,PDNCT3 -- COUNTERS COPY A,PDNCT4 -- COPY A,COUNT1 CLEAR PASS COUNTER COPY A,COUNT2 DITTO COPY A,COUNT3 DITTO COPY A,COUNT4 DITTO COPY A,SLVNUM INITIALIZE SLAVE NUMBER COPY A,CDRHLD CLEAR CONSOLE DATA REG. OUTPUT VALUE UIS DISABLE INTERRUPTS FROM SLAVES * * RESET 4/10T AND LOAD QCD INTO SLAVE(S) * INIT5 COPY =1,Q SET BIT ON XNX X INDEX NEXT SELP Q,0 SET PROGRAMMED RESETON SLAVE IJNE Q,$ DO DELAY COPY =1,Q SET BIT ON AGAIN XNX X INDEX NEXT SELP Q,3 CLEAR SLAVE CONTROL REGISTER * COPY ENDQCD,A GET ENDING ADDRESS NEG A NEGATE IT COPY A,CNT STORE NEGATIVE WORD COUNT COPY =0,A SET FIRST ADDRESS LOCATION COPY A,ADDR STORE IT COPY IMSDRI,A 'INPUT TO MEMORY FROM SLAVE CDR' COPY A,*SCIR STORE IT INIT6 COPY ADDR,A GET CURRENT MEM. ADDRESS COPY A,*SCMAR STORE IT IN CONTROL REG. COPY *ADDR,A GET CURRENT MEM. CONTENTS COPY A,*SCDR STORE IT IN CONTROL REG. JST DOIT MAKE SLAVE DO IT HLT TIMED OUT IMS ADDR INC. ADDRESS IMS CNT INC. WORD COUNT JMP INIT6 LOOP FOR MORE * COPY A01PNT,A GET STARTING ADDR. COPY A,*SCDR STORE IT IN CONTROL REG. COPY ISDRPI,A 'INPUT FROM SLAVE CONTROL DATA REGISTER-P REG.' COPY A,*SCIR STORE IT IN CONTROL REG. JST DOIT MAKE SLAVE DO IT HLT TIMED OUT * COPY =0,A -- RESET COPY A,CDRHLD -- CDR HOLDING CELL SELP A,4 SEND TO CDR COPY STARTI,A 'START' COPY A,*SCIR STORE IT IN CONTROL REG. JST DOIT MAKE SLAVE DO IT HLT TIMED OUT * COPY =0,Q SET LOOP COUNT INIT7 COPY CDRHLD,A GET CDR CONTENTS JNE A,$+3 SOMETHING WAS RETURNED IJNE Q,INIT7 LOOP BACK HLT DIDN'T RETURN A VALUE IN TIME SELP A,4 SEND TO HOST CDR HLT LET USER SEE IT JST DOIT MAKE SLAVE CONTINUE HLT TIMED OUT IMS SLVNUM INC. SLAVE NUMBER SUB =:10,X GENERATE NEXT SLAVE ADDRESS JNED Y,INIT5 DO NEXT SLAVE * CONT1 EQU $ RBIT 12,S -- ENABLE INTERRUPTS UIS - -- FROM SLAVES SBIT 12,S DISABLE INTERRUPTS FROM SLAVES AFTER INTERRUPT COPY CDRHLD,A GET VALUE FOR CONSOLE DATA REG SELP A,4 OUTPUT TO CONSOLE DATA REG JMP $-2 WAIT FOR INTERRUPT * CNT RES 1,0 COUNT ADDR RES 1,0 ADDRESS TITL SLAVE DMA CONTROL * * * SLAVE DMA CONTROL ROUTINE * * INPUT: * * X REG = SLAVE DEVICE ADDRESS * * * OUTPUT: * * RETURN ADDRESS - DMA TIMED OUT * * RETURN ADDRESS+1 - EVERYTHING IS OK * * DOIT ENT COPY =0,A SET TIME DELAY COPY =1,Q SET BIT ON XNX X INDEX NEXT SELP Q,2 MAKE SLAVE DO IT XNX X INDEX NEXT SST 2 DID HE GET IT? JMP $+2 NO, DEC. COUNT JMP $+3 YES, CONTINUE IJNE A,$-4 DEC. DELAY COUNT JMP *DOIT ERROR EXIT XNX X INDEX NEXT SST 2 DID HE ACT ON IT? JMP $+3 YES, CONTINUE IJNE A,$-3 NO, DEC. COUNT JMP *DOIT ERROR EXIT IMS DOIT SET GOOD RETURN JMP *DOIT DO GOOD RETURN TITL SLAVE MEMORY/REGISTER INSPECT ROUTINE * * SLAVE MEMORY/REGISTER INSPECT ROUTINE * * INPUT: * * A REG BIT 0 0 = MEMORY INSPECT * 1 = REGISTER INSPECT * *  BIT 1 0 = NO AUTO INCREMENT * 1 = AUTO INCREMENT * * BIT 2  0 = SINGLE ACCESS * 1 = CONTINUOUS ACCESS (NO AUTO INC.) * * BIT 3   0 = NO READ/WRITE ALTERNATION * 1 = READ/WRITE ALTERNATION *  (FORCED CONTINUOUS ACCESS) * * BIT 4-11 SLAVE DEVICE ADDRESS * * X REG MEMORY ADDRESS OR REGISTER CODE. * REGISTER CODES AS FOLLOWS: * * A = 0 *  Q = 1 * X = 2 * Y = 3 * P = 4 * S = 5 * K = 6 * L = 7 * * DATA REG DATA FOR WRITE OPERATION * * SENSE SW 0 = READ * 1 = WRITE * * OUTPUT: * * DATA REG DATA FROM READ OPERATION * * * SLINSP EQU $ COPY =0,Q OUT Q,0 RESET SENSE SWITCH SLINS1 TBIT 0,A MEMORY OR REGISTER OPERATION ? JT OV,SLVREG REGISTER INSPECT * * MEMORY INSPECT * SLVMEM JF SS,SLVMRD CHECK FOR READ OR WRITE. JUMP FOR READ IN 4,Q GET DATA FROM CONSOLE DATA REGISTER COPY Q,*SCDR PUT IN SLAVE DATA REGISTER COPY IMSDRI,Q 'INPUT FROM SLAVE DATA REGISTER' INSTRUCTION JMP $+2 SLVMRD EQU $ READ MEMORY COPY OMSDRI,Q 'OUTPUT TO SLAVE DATA REGISTER' INSTR. COPY Q,*SCIR STORE IN SLAVE INSTRUCTION REGISTER COPY X,*SCMAR STORE MEMORY ADDRESS IN SLAVE MEM. ADDR. REG. COPY A,Y OPERATOR CHOICES SHIFT Y,RO,4 GET DEVICE ADDRESS AND =:FF,Y MASK IT COPY =1,Q DATA FOR SELP SLVM1 XNX Y INDEX DEVICE ADDRESS SELP Q,2 DO MEMORY OPERATION SLVM2 XNX Y INDEX DEVICE ADDRESS SST 2 SENSE FOR MEMORY OPERATION DONE -- SKIP IF NOT  JMP SLVM3 OPERATION DONE IJNE Q,SLVM2 INCREMENT TIME-OUT COUNT -- JUMP IF NOT EXP. JST ERRLIT  GO TO ERROR LIGHT ROUTINE TBIT 2,A CHECK FOR SINGLE OR CONTINUOUS ACCESS JF OV,$-2 SINGLE ACCESS -- CONTINUE ERROR LIGHT ROUTINE JMP SLVM1 CONTINUOUS ACCESS -- REPEAT MEMORY OPERATION TITL SLVM3 EQU $ MEMORY OPERATION DONE JT SS,$+3 CHECK FOR READ OR WRITE -- JUMP FOR WRITE COPY *SCDR,Q GET CONTENTS OF SLAVE DATA REGISTER SELP Q,4 OUTPUT DATA TO CONSOLE DATA REGISTER TBIT 3,A CHECK FOR READ/WRITE ALTERNATION JF OV,SLVM4 JUMP FOR NO ALTERNATION COPY =0,Q -- JT SS,$+2 -- COMPLEMENT COPY =1,Q -- SENSE SWITCH OUT Q,0 -- JMP SLVMEM DO COMPLEMENT OPERATION SLVM4 TBIT 2,A CHECK FOR SINGLE OR CONTINUOUS ACCESS JT OV,SLVM1 JUMP FOR CONTINUOUS ACCESS -- REPEAT OPERATION  TBIT 1,A SINGLE ACCESS -- CHECK FOR AUTO-INCREMENT JF OV,$+2 JUMP IF NO AUTO-INCREMENT ADD =1,X INCREMENT MEMORY ADDRESS HLT WAIT FOR OPERATOR ACTION JMP SLINS1 DO ANOTHER MEMORY OR REGISTER OPERATION TITL * * REGISTER INSPECT * SLVREG JF SS,SLVRRD TEST FOR READ OR WRITE. JUMP FOR READ IN 4,Q GET DATA FROM CONSOLE DATA REGISTER COPY Q,*SCDR PUT IN SLAVE DATA REGISTER COPY ISDRI,Q ' INPUT FROM SLAVE DATA REGISTER' INSTR. JMP $+2 SLVRRD EQU $ READ REGISTER COPY OSDRI,Q 'OUTPUT TO SLAVE DATA REGISTER' INSTR. COPY =8,Y REGISTER COMPARISON VALUE CSM X,Y CHECK RANGE OF REGISTER SELECTION JMP $+3 OK JST ERRLIT -- ERROR-WRONG JMP $-1 -- REGISTER SELECTION  XNX X USE REGISTER SELECTION AS INDEX COPY REGS3,Y GET S3 FIELD FOR INSTRUCTION OR Y,Q ADD TO INSTRUCTION SKELETON COPY Q,*SCIR STORE INSTRUCTION IN SLAVE INSTR. REG. COPY A,Y OPERATOR CHOICES SHIFT Y,RO,4 GET DEVICE ADDRESS AND =:FF,Y MASK IT COPY =1,Q DATA FOR SELP SLVR1 XNX Y INDEX DEVICE ADDRESS SELP Q,2 DO REGISTER OPERATION SLVR2 XNX Y INDEX DEVICE ADDRESS SST 2 SENSE FOR REGISTER OPERATION DONE - SKIP IF NOT JMP SLVR3 OPERATION DONE IJNE Q,SLVR2 INCREMENT TIME-OUT COUNT -- JUMP IF NOT EXP. JST ERRLIT TIME-OUT EXPIRED -- GO TO ERROR LIGHT ROUTINE TBIT 2,A CHECK FOR SINGLE OR CONTINUOUS ACCESS JF OV,$-2 JUMP FOR SINGLE ACCESS -- CONTINUE LIGHTS JMP SLVR1 CONTINUOUS ACCESS -- REPEAT OPERATION TITL SLVR3 EQU $ REGISTER OPERATION DONE JT SS,$+3 CHECK FOR READ OR WRITE -- JUMP FOR WRITE COPY *SCDR,Q GET CONTENTS OF SLAVE DATA REGISTER SELP Q,4 OUTPUT DATA TO CONSOLE DATA REGISTER TBIT 3,A CHECK FOR READ/WRITE ALTERNATION JF OV,SLVR4 JUMP FOR NO ALTERNATION  COPY =0,Q -- JT SS,$+2 -- COMPLEMENT COPY =1,Q -- SENSE SWITCH OUT Q,0 --  JMP SLVREG DO COMPLEMENT OPERATION SLVR4 TBIT 2,A CHECK FOR SINGLE OR CONTINUOUS ACCESS JT OV,SLVR1 JUMP FOR CONTINUOUS ACCESS -- REPEAT OPERATION TBIT 1,A CHECK FOR AUTO-INCREMENT JF OV,$+3 JUMP IF NO AUTO-INCREMENT ADD =1,X INCREMENT REGISTER # AND =7,X WRAP AROUND TO 0 AFTER 7 HLT  WAIT FOR OPERATOR ACTION JMP SLINS1 DO ANOTHER MEMORY OR REGISTER OPERATION * * TABLE OF INSTRUCTION S3 FIELDS * REGS3 EQU $ WORD :0000 A REGISTER WORD :0040 Q REGISTER WORD :0020 X REGISTER WORD :0060 Y REGISTER WORD :0010 P REGISTER WORD :0030 S REGISTER WORD :0070 K REGISTER WORD :0050 L REGISTER TITL ERROR LIGHT ROUTINE * * ERROR LIGHT ROUTINE * * BLINK OV FOR APPROX. .25 SEC. * ERRLIT ENT RBIT 2,S RESET OV IMS ERRTMP -- INCREMENT ERRTMP TO 0. OV GETS SET JMP $-1 -- WHEN ERRTMP GOES NEGATIVE JMP *ERRLIT RETURN ERRTMP RES 1,0 TITL SLAVE CONTROL ROUTINE * * SLAVE CONTROL ROUTINE * * INPUT: * * A REG BIT0 0 = START *  1 = SINGLE STEP * * BIT 2 0 = SINGLE ACCESS * 1 = CONTINUOUS ACCESS * * BIT 4-11 SLAVE DEVICE ADDRESS * * OUTPUT: * * DATA REG SLAVE P REG CONTENTS FO LLOWING SINGLE STEP * SLCTRL EQU $ TBIT 0,A 'START' OR 'SINGLE STEP' ? JT OV,SLSSTP JUMP IF SINGLE STEP COPY STARTI,Q 'START' INSTRUCTION JMP $+2 SLSSTP COPY SSTPI,Q 'SINGLE STEP' INSTRUCTION COPY Q,*SCIR STORE INSTRUCTION IN SLAVE INSTR. REG. COPY A,Y OPERATOR CHOICES SHIFT Y,RO,4 GET DEVICE ADDRESS AND =:FF,Y MASK IT COPY =1,Q DATA FOR SELP SLVST1 XNX Y INDEX DEVICE ADDRESS SELP Q,2 START SLAVE SLVST2 XNX Y INDEX DEVICE ADDRESS SST 2 SENSE FOR OPERATION DONE - SKIP IF NOT JMP SLVST3 OPERATION DONE IJNE Q,SLVST2 INCREMENT TIME-OUT COUNT -- JUMP IF NOT EXP. JST ERRLIT TIME-OUT EXPIRED -- GO TO ERROR LIGHT ROUTINE TBIT 2,A CHECK FOR SINGLE OR CONTINUOUS ACCESS JF OV,$-2 JUMP FOR SINGLE ACCESS -- CONTINUE LIGHTS JMP SLVST1 CONTINUOUS ACCESS -- REPEAT OPERATION * SLVST3 EQU $ OPERATION DONE TBIT 0,A START OR SINGLE STEP ? JF OV,SLVST4 SKIP CONSOLE DISPLAY OUTPUT FOR START COPY OSDRPI,Q 'OUTPUT P TO SLAVE DATA REG.' INST. COPY Q,*SCIR STORE IN SLAVE INSTRUCTION REG. COPY =1,Q  DATA FOR SELP XNX Y INDEX DEVICE ADDRESS SELP Q,2 INSPECT SLAVE P REG. COPY *SCDR,Q  LOAD Q WITH SLAVE P REG CONTENTS SELP Q,4 OUTPUT TO CONSOLE DATA REG. SLVST4 HLT WAIT FOR OPERATOR ACTION JMP SLCTRL DO ANOTHER CONTROL OPERATION * SAVE END SOLE DISPLAY OUTPUT FOR START COPY OSDRPI,Q 'OUTPUT P TO SLAVE DATA REG.' INST. COPY Q,*SCIR STORE IN SLAVE INSTRUCTION REG. COPY =1,Q IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe811116175633811116175633811116175846e@811116175633811116175633811116175728" e811116175633811116175633811116175633e811116175633811116175633811116175633811116175633811116175633811116175633eN820913161146L820913161203L811116175815eR-YZ820913161234L820913161246L811116175838e [820913161327L820913161330L811116175845# $ % & ' ( ) * + . QCD4TPART2 ASMQCD4TNUC ASMQCD4TPARTX ASM,  TITL NM4 4/10T QCD PART X 84-93898-14A0 * * * * NM4 4/10T QCD PART X * * * * 84-93898-14-A0 * * * * COPYRIGHT 1982 COMPUTER AUTOMATION INC. * TITL EXTERNAL "LINKS" NAM PARTX NAM MOVE ABS PART2END TITL LOOP ROUTINE ****** * * LOOP ROUTINE * ****** PARTX EQU $ COPY SLVNUM,X GET SLAVE NUMBER ADD =COUNT1,X ADD COUNT OFFSET PNX MAKE A PUBLIC ACCESS IMS 0(X) INCREMENT PASS COUNTER IN PUBLIC MEMORY NOP COPY HINTP,A GET POINTER TO HOST INTERRUPT VECTOR COPY SLVNUM,X GET SLAVE NUMBER SHIFT X,LO,4 PUT INTO PLACE NEG X NEGATE IT ADD DABASE,X GENERATE SLAVE DEVICE ADDRESS (DABASE-SLVNUM) XNX X INDEX NEXT SELP A,:7 INTERRUPT HOST XNX X INDEX NEXT SST :F SENSE FOR INTERRUPT ACKNOWLEDGED JMP $+2 INTERRUPT ACKNOWLEDGED  JMP $-3 INTERRUPT NOT ACKNOWLEDGED COPY SLVNUM,A GET SLAVE NUMBER PNX MAKE A PUBLIC ACCESS  COPY A,SLVNUM STORE IN CURRENT SLAVE NUMBER CELL IN PUBLIC MEM JMP *$+1 LOOP TO BEGINNING OF PAT WORD A02000 * HINTP WORD HSTINT POINTER TO HOST INTERRUPT VECTOR + CREG DATA * RES $;:3F-$&:3F+1,0 TITL PI MEMORY MOVE ROUTINE * ENTER WITH: * X REGISTER = "FROM" WORD ADDRESS * Y REGISTER = "TO" WORD ADDRESS * Q REGISTER = POSITIVE WORD LENGTH * MOVE COPY X,SRCE SAVE SOURCE ADDRESS COPY Y,DEST SAVE DESTINATION ADDRESS NEG Q,Q NEGATE COUNT COPY Q,LEN SAVE NEG COUNT MOVE2 COPY 0(X),A GET A WORD COPY A,0(Y) MOVE IT ADD =1,X BUMP FROM POINTER ADD =1,Y BUMP TO POINTER ADD  =1,Q BUMP COUNT JNE Q,MOVE2 DONE MOVING ? COPY SRCE,X YES, RESET SOURCE POINTER COPY DEST,Y RESET DESTINATION POINTER COPY LEN,Q RESET COUNT MOVE3 COPY 0(X),A GET A WORD SUB 0(Y),A  SUBTRACT MOVED VALUE JNE A,MOVE5 ERROR IF NO MATCH MOVE4 ADD =1,X BUMP FROM POINTER ADD =1,Y  BUMP TO POINTER ADD =1,Q BUMP COUNT JNE Q,MOVE3 CONTINUE IF NOT DONE COPY =0,A DISPLAY FOR SUCCESSFUL MOVE SELP A,4 OUTPUT TO CONSOLE DATA REGISTER HLT SUCCESSFUL MOVE JMP $-1 MOVE5 COPY =-1,A DISPLAY FOR UNSUCCESSFUL MOVE SELP A,4 OUTPUT TO CONSOLE DATA REGISTER HLT ERROR HALT - INCORRECT DATA MOVED JMP MOVE4 CONTINUE * SRCE RES 1,0 SOURCE POINTER DEST  RES 1,0 DESTINATION POINTER LEN RES 1,0 WORD LENGTH (2'S COMPLEMENT) RES $;:FF-$&:FF,0 * REL $ RES 1,0 SO REL CODE CAN BE LINKED AT END * SAVE END SUCCESSFUL MOVE JMP $-1 MOVE5 COPY =-1,A DISPLAY FOR UNSUCCESSFUL MOVE SELP A,4 OUTPUT TO CONSOLE DATA REGISTER HLTIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII- IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII. IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII/ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII0 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII1 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