{"id":608,"date":"2026-01-10T03:37:58","date_gmt":"2026-01-10T03:37:58","guid":{"rendered":"https:\/\/i-cte.org\/robot\/?p=608"},"modified":"2026-01-10T04:10:46","modified_gmt":"2026-01-10T04:10:46","slug":"ielts-reading-test-3","status":"publish","type":"post","link":"https:\/\/i-cte.org\/robot\/ielts-reading-test-3\/","title":{"rendered":"IELTs &#8211; Reading &#8211; Test 3"},"content":{"rendered":"\n<!-- \u2705 WordPress-friendly (paste into a Custom HTML block) -->\n<div id=\"icte-reading-test3\">\n\n  <!-- \u2705 TOP GREEN MENU -->\n  <nav class=\"icte-menu\" aria-label=\"ICTE Reading menu\">\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-reading-overview\/\">Overview<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-cork\/\">Test 1<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-reading-test-2\/\">Test 2<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-reading-test-3\/\">Test 3<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-reading-test-4\/\">Test 4<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-listening-overview\/\">Listening<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-speaking-overview\/\">Speaking<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-writing-overview\/\">Writing<\/a>\n  <\/nav>\n\n  <!-- \u2705 GLOBAL CONTROLS -->\n  <section class=\"icte-ielts icte-ielts--top\" aria-label=\"Global controls\">\n    <header class=\"icte-ielts__intro\">\n      <h2 class=\"icte-ielts__title\">IELTS Reading \u2013 Test 3 (Passages 1\u20133)<\/h2>\n      <p class=\"icte-ielts__sub\">\n        Practice all 3 passages on one page. Use <strong>Check Answers<\/strong> in each passage for feedback.\n      <\/p>\n    <\/header>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Voice controls\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Read Aloud (optional)<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--danger\" type=\"button\" data-action=\"stop-audio\">\u23f9 Stop<\/button>\n          <span class=\"icte-loader\" data-el=\"synthesis-loader\" aria-hidden=\"true\"><\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"icte-ielts__row\" style=\"align-items:flex-start;\">\n        <div class=\"icte-ielts__control\" style=\"flex:1; min-width:240px;\">\n          <label><strong>Voice<\/strong> (Narrator)<\/label>\n          <select data-el=\"voice-a\" aria-label=\"Select narrator voice\">\n            <option value=\"\">Loading voices&#8230;<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"icte-ielts__score\" data-el=\"overallScoreBox\" aria-live=\"polite\"><\/div>\n      <\/div>\n\n      <div class=\"icte-ielts__btnRow\">\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"scroll-p1\">Go to Passage 1<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"scroll-p2\">Go to Passage 2<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"scroll-p3\">Go to Passage 3<\/button>\n      <\/div>\n    <\/section>\n  <\/section>\n\n  <!-- =========================\n       PASSAGE 1 (Q1\u201313)\n  ========================== -->\n  <section class=\"icte-ielts\" id=\"p1\" data-section=\"p1\" aria-label=\"Reading Passage 1\">\n    <header class=\"icte-ielts__intro\">\n      <h2 class=\"icte-ielts__title\">Reading Passage 1 (Questions 1\u201313)<\/h2>\n      <p class=\"icte-ielts__sub\">\n        Passage: <strong>Flying tortoises<\/strong>. Questions 1\u20137 (Matching headings), 8\u201313 (Notes completion \u2013 ONE WORD ONLY).\n      <\/p>\n    <\/header>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Passage 1 text\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Reading Passage 1<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"toggle-passage\">Hide Passage<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__reading\" data-el=\"passage-area\"><\/div>\n\n      <div class=\"icte-ielts__btnRow icte-ielts__btnRow--tight\">\n        <button class=\"icte-btn icte-btn--info\" type=\"button\" data-action=\"read-aloud\">\ud83d\udd0a Read Aloud (Passage 1)<\/button>\n        <a class=\"icte-link\" href=\"#q-p1\">Jump to questions \u2193<\/a>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Support P1\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Support<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"clear-support\">Clear<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__helper\" data-el=\"helper-area\" aria-live=\"polite\">\n        Click <strong>Summary<\/strong>, <strong>Main ideas<\/strong>, or <strong>Keywords<\/strong>.\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Controls P1\">\n      <div class=\"icte-ielts__btnGrid\">\n        <button class=\"icte-btn icte-btn--primary\" type=\"button\" data-action=\"check\">Check Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"show\">\ud83d\udc40 Show Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"summary\">\ud83e\udde0 Summary<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"main-ideas\">\ud83d\udccc Main ideas<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"keywords\">\ud83d\udcda Keywords<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"reset\">Reset<\/button>\n      <\/div>\n      <div class=\"icte-ielts__row\" style=\"padding-top:0;\">\n        <div class=\"icte-ielts__score\" data-el=\"scoreBox\" aria-live=\"polite\"><\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" id=\"q-p1\" aria-label=\"Questions 1-13\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Questions 1\u201313<\/h3>\n      <\/div>\n\n      <div class=\"icte-ielts__qArea\">\n\n        <!-- Q1\u20137 -->\n        <div class=\"icte-q\">\n          <div class=\"icte-q__label\">Questions 1\u20137 (Choose the correct heading for each paragraph)<\/div>\n          <div class=\"icte-note\">\n            <strong>List of Headings<\/strong>:\n            i The importance of getting the timing right \u2022\n            ii Young meets some difficulties \u2022\n            iii Developments to the disadvantage of tortoise populations \u2022\n            iv Planning a bigger reintroduction \u2022\n            v Tortoises populate the islands \u2022\n            vi Carrying out a carefully prepared operation \u2022\n            vii Looking for a home for the islands\u2019 tortoises\n          <\/div>\n\n          <div class=\"icte-grid2\">\n            <div class=\"icte-day\">\n              <div><strong>1.<\/strong> Paragraph A<\/div>\n              <select data-q=\"1\" data-type=\"select\">\n                <option value=\"\">Select i\u2013vii<\/option>\n                <option>i<\/option><option>ii<\/option><option>iii<\/option><option>iv<\/option><option>v<\/option><option>vi<\/option><option>vii<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"1\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>2.<\/strong> Paragraph B<\/div>\n              <select data-q=\"2\" data-type=\"select\">\n                <option value=\"\">Select i\u2013vii<\/option>\n                <option>i<\/option><option>ii<\/option><option>iii<\/option><option>iv<\/option><option>v<\/option><option>vi<\/option><option>vii<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"2\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>3.<\/strong> Paragraph C<\/div>\n              <select data-q=\"3\" data-type=\"select\">\n                <option value=\"\">Select i\u2013vii<\/option>\n                <option>i<\/option><option>ii<\/option><option>iii<\/option><option>iv<\/option><option>v<\/option><option>vi<\/option><option>vii<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"3\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>4.<\/strong> Paragraph D<\/div>\n              <select data-q=\"4\" data-type=\"select\">\n                <option value=\"\">Select i\u2013vii<\/option>\n                <option>i<\/option><option>ii<\/option><option>iii<\/option><option>iv<\/option><option>v<\/option><option>vi<\/option><option>vii<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"4\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>5.<\/strong> Paragraph E<\/div>\n              <select data-q=\"5\" data-type=\"select\">\n                <option value=\"\">Select i\u2013vii<\/option>\n                <option>i<\/option><option>ii<\/option><option>iii<\/option><option>iv<\/option><option>v<\/option><option>vi<\/option><option>vii<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"5\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>6.<\/strong> Paragraph F<\/div>\n              <select data-q=\"6\" data-type=\"select\">\n                <option value=\"\">Select i\u2013vii<\/option>\n                <option>i<\/option><option>ii<\/option><option>iii<\/option><option>iv<\/option><option>v<\/option><option>vi<\/option><option>vii<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"6\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>7.<\/strong> Paragraph G<\/div>\n              <select data-q=\"7\" data-type=\"select\">\n                <option value=\"\">Select i\u2013vii<\/option>\n                <option>i<\/option><option>ii<\/option><option>iii<\/option><option>iv<\/option><option>v<\/option><option>vi<\/option><option>vii<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"7\"><\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n\n        <!-- Q8\u201313 -->\n        <div class=\"icte-q\">\n          <div class=\"icte-q__label\">Questions 8\u201313 (ONE WORD ONLY)<\/div>\n          <div class=\"icte-note\">Complete the notes. Choose <strong>ONE WORD ONLY<\/strong> from the passage for each answer.<\/div>\n\n          <div class=\"icte-note\" style=\"margin-top:.25rem;\">\n            <div><strong>The decline of Galapagos tortoise<\/strong><\/div>\n            <div style=\"margin-top:.5rem;\">\u2022 17th century: small numbers taken onto ships used by\n              <span class=\"blank\"><input type=\"text\" data-q=\"8\" data-type=\"word\" data-max=\"1\" placeholder=\"ONE WORD\" \/><\/span>\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"8\"><\/div>\n\n            <div style=\"margin-top:.55rem;\">\u2022 1790s: very large numbers taken onto whaling ships, kept for\n              <span class=\"blank\"><input type=\"text\" data-q=\"9\" data-type=\"word\" data-max=\"1\" placeholder=\"ONE WORD\" \/><\/span>\n              and also used to produce\n              <span class=\"blank\"><input type=\"text\" data-q=\"10\" data-type=\"word\" data-max=\"1\" placeholder=\"ONE WORD\" \/><\/span>\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"9\"><\/div>\n            <div class=\"icte-q__fb\" data-fb=\"10\"><\/div>\n\n            <div style=\"margin-top:.55rem;\">\u2022 Hunted by\n              <span class=\"blank\"><input type=\"text\" data-q=\"11\" data-type=\"word\" data-max=\"1\" placeholder=\"ONE WORD\" \/><\/span>\n              on the islands\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"11\"><\/div>\n\n            <div style=\"margin-top:.55rem;\">\u2022 Habitat destruction and introduced\n              <span class=\"blank\"><input type=\"text\" data-q=\"12\" data-type=\"word\" data-max=\"1\" placeholder=\"ONE WORD\" \/><\/span>\n              (not native to the islands) fed on baby tortoises and tortoises\u2019 \n              <span class=\"blank\"><input type=\"text\" data-q=\"13\" data-type=\"word\" data-max=\"1\" placeholder=\"ONE WORD\" \/><\/span>\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"12\"><\/div>\n            <div class=\"icte-q__fb\" data-fb=\"13\"><\/div>\n          <\/div>\n        <\/div>\n\n      <\/div>\n    <\/section>\n  <\/section>\n\n  <!-- =========================\n       PASSAGE 2 (Q14\u201326)\n  ========================== -->\n  <section class=\"icte-ielts\" id=\"p2\" data-section=\"p2\" aria-label=\"Reading Passage 2\">\n    <header class=\"icte-ielts__intro\">\n      <h2 class=\"icte-ielts__title\">Reading Passage 2 (Questions 14\u201326)<\/h2>\n      <p class=\"icte-ielts__sub\">\n        Passage: <strong>The intersection of health sciences and geography<\/strong>. Questions 14\u201319 (Paragraph matching A\u2013H), 20\u201326 (ONE WORD ONLY).\n      <\/p>\n    <\/header>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Passage 2 text\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Reading Passage 2<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"toggle-passage\">Hide Passage<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__reading\" data-el=\"passage-area\"><\/div>\n\n      <div class=\"icte-ielts__btnRow icte-ielts__btnRow--tight\">\n        <button class=\"icte-btn icte-btn--info\" type=\"button\" data-action=\"read-aloud\">\ud83d\udd0a Read Aloud (Passage 2)<\/button>\n        <a class=\"icte-link\" href=\"#q-p2\">Jump to questions \u2193<\/a>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Support P2\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Support<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"clear-support\">Clear<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__helper\" data-el=\"helper-area\" aria-live=\"polite\">\n        Click <strong>Summary<\/strong>, <strong>Main ideas<\/strong>, or <strong>Keywords<\/strong>.\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Controls P2\">\n      <div class=\"icte-ielts__btnGrid\">\n        <button class=\"icte-btn icte-btn--primary\" type=\"button\" data-action=\"check\">Check Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"show\">\ud83d\udc40 Show Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"summary\">\ud83e\udde0 Summary<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"main-ideas\">\ud83d\udccc Main ideas<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"keywords\">\ud83d\udcda Keywords<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"reset\">Reset<\/button>\n      <\/div>\n      <div class=\"icte-ielts__row\" style=\"padding-top:0;\">\n        <div class=\"icte-ielts__score\" data-el=\"scoreBox\" aria-live=\"polite\"><\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" id=\"q-p2\" aria-label=\"Questions 14-26\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Questions 14\u201326<\/h3>\n      <\/div>\n\n      <div class=\"icte-ielts__qArea\">\n\n        <!-- Q14\u201319 -->\n        <div class=\"icte-q\">\n          <div class=\"icte-q__label\">Questions 14\u201319 (Which paragraph contains the following information?)<\/div>\n          <div class=\"icte-note\">Choose the correct letter, <strong>A\u2013H<\/strong>. You may use any letter more than once.<\/div>\n\n          <div class=\"icte-grid2\">\n            <div class=\"icte-day\">\n              <div><strong>14.<\/strong> an acceptance that not all diseases can be totally eliminated<\/div>\n              <select data-q=\"14\" data-type=\"select\">\n                <option value=\"\">Select A\u2013H<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option><option>H<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"14\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>15.<\/strong> examples of physical conditions caused by human behaviour<\/div>\n              <select data-q=\"15\" data-type=\"select\">\n                <option value=\"\">Select A\u2013H<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option><option>H<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"15\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>16.<\/strong> a reference to classifying diseases on the basis of how far they extend geographically<\/div>\n              <select data-q=\"16\" data-type=\"select\">\n                <option value=\"\">Select A\u2013H<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option><option>H<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"16\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>17.<\/strong> reasons why the level of access to healthcare can vary within a country<\/div>\n              <select data-q=\"17\" data-type=\"select\">\n                <option value=\"\">Select A\u2013H<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option><option>H<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"17\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>18.<\/strong> a description of health geography as a mixture of different academic fields<\/div>\n              <select data-q=\"18\" data-type=\"select\">\n                <option value=\"\">Select A\u2013H<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option><option>H<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"18\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>19.<\/strong> a description of the type of area where a particular illness is rare<\/div>\n              <select data-q=\"19\" data-type=\"select\">\n                <option value=\"\">Select A\u2013H<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option><option>H<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"19\"><\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n\n        <!-- Q20\u201326 -->\n        <div class=\"icte-q\">\n          <div class=\"icte-q__label\">Questions 20\u201326 (ONE WORD ONLY)<\/div>\n          <div class=\"icte-note\">Complete the sentences. Choose <strong>ONE WORD ONLY<\/strong> from the passage.<\/div>\n\n          <div class=\"icte-note\">\n            <div><strong>20.<\/strong> Certain diseases have disappeared, thanks to better\n              <span class=\"blank\"><input type=\"text\" data-q=\"20\" data-type=\"word\" data-max=\"1\" placeholder=\"ONE WORD\" \/><\/span>\n              and healthcare.\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"20\"><\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>21.<\/strong> Because there is more contact between people,\n              <span class=\"blank\"><input type=\"text\" data-q=\"21\" data-type=\"word\" data-max=\"1\" placeholder=\"ONE WORD\" \/><\/span>\n              are losing their usefulness.\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"21\"><\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>22.<\/strong> Disease-causing\n              <span class=\"blank\"><input type=\"text\" data-q=\"22\" data-type=\"word\" data-max=\"1\" placeholder=\"ONE WORD\" \/><\/span>\n              are most likely to be found in hot, damp regions.\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"22\"><\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>23.<\/strong> One cause of pollution is\n              <span class=\"blank\"><input type=\"text\" data-q=\"23\" data-type=\"word\" data-max=\"1\" placeholder=\"ONE WORD\" \/><\/span>\n              that burn a particular fuel.\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"23\"><\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>24.<\/strong> The growth of cities often has an impact on nearby\n              <span class=\"blank\"><input type=\"text\" data-q=\"24\" data-type=\"word\" data-max=\"1\" placeholder=\"ONE WORD\" \/><\/span>.\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"24\"><\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>25.<\/strong>\n              <span class=\"blank\"><input type=\"text\" data-q=\"25\" data-type=\"word\" data-max=\"1\" placeholder=\"ONE WORD\" \/><\/span>\n              is one disease that is growing after having been eradicated.\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"25\"><\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>26.<\/strong> A physical barrier such as a\n              <span class=\"blank\"><input type=\"text\" data-q=\"26\" data-type=\"word\" data-max=\"1\" placeholder=\"ONE WORD\" \/><\/span>\n              can prevent people from reaching a hospital.\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"26\"><\/div>\n          <\/div>\n        <\/div>\n\n      <\/div>\n    <\/section>\n  <\/section>\n\n  <!-- =========================\n       PASSAGE 3 (Q27\u201340)\n  ========================== -->\n  <section class=\"icte-ielts\" id=\"p3\" data-section=\"p3\" aria-label=\"Reading Passage 3\">\n    <header class=\"icte-ielts__intro\">\n      <h2 class=\"icte-ielts__title\">Reading Passage 3 (Questions 27\u201340)<\/h2>\n      <p class=\"icte-ielts__sub\">\n        Passage: <strong>Music and the emotions<\/strong>. Questions 27\u201331 (Summary completion \u2264 TWO WORDS), 32\u201336 (MCQ A\u2013D), 37\u201340 (Matching sentence endings A\u2013F).\n      <\/p>\n    <\/header>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Passage 3 text\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Reading Passage 3<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"toggle-passage\">Hide Passage<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__reading\" data-el=\"passage-area\"><\/div>\n\n      <div class=\"icte-ielts__btnRow icte-ielts__btnRow--tight\">\n        <button class=\"icte-btn icte-btn--info\" type=\"button\" data-action=\"read-aloud\">\ud83d\udd0a Read Aloud (Passage 3)<\/button>\n        <a class=\"icte-link\" href=\"#q-p3\">Jump to questions \u2193<\/a>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Support P3\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Support<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"clear-support\">Clear<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__helper\" data-el=\"helper-area\" aria-live=\"polite\">\n        Click <strong>Summary<\/strong>, <strong>Main ideas<\/strong>, or <strong>Keywords<\/strong>.\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Controls P3\">\n      <div class=\"icte-ielts__btnGrid\">\n        <button class=\"icte-btn icte-btn--primary\" type=\"button\" data-action=\"check\">Check Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"show\">\ud83d\udc40 Show Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"summary\">\ud83e\udde0 Summary<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"main-ideas\">\ud83d\udccc Main ideas<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"keywords\">\ud83d\udcda Keywords<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"reset\">Reset<\/button>\n      <\/div>\n      <div class=\"icte-ielts__row\" style=\"padding-top:0;\">\n        <div class=\"icte-ielts__score\" data-el=\"scoreBox\" aria-live=\"polite\"><\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" id=\"q-p3\" aria-label=\"Questions 27-40\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Questions 27\u201340<\/h3>\n      <\/div>\n\n      <div class=\"icte-ielts__qArea\">\n\n        <!-- Q27\u201331 -->\n        <div class=\"icte-q\">\n          <div class=\"icte-q__label\">Questions 27\u201331 (NO MORE THAN TWO WORDS)<\/div>\n          <div class=\"icte-note\">Complete the summary. Choose <strong>NO MORE THAN TWO WORDS<\/strong> from the passage for each answer.<\/div>\n\n          <div class=\"icte-note\" style=\"margin-top:.25rem;\">\n            <div><strong>The Montreal Study<\/strong><\/div>\n\n            <div style=\"margin-top:.55rem;\">\n              Participants had their brain activity monitored while listening to their favourite music.\n              The music stimulated neurons to release a substance called\n              <span class=\"blank\"><input type=\"text\" data-q=\"27\" data-type=\"text\" data-max=\"2\" placeholder=\"\u2264 TWO WORDS\" \/><\/span>\n              in parts of the brain associated with feeling\n              <span class=\"blank\"><input type=\"text\" data-q=\"28\" data-type=\"text\" data-max=\"2\" placeholder=\"\u2264 TWO WORDS\" \/><\/span>.\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"27\"><\/div>\n            <div class=\"icte-q__fb\" data-fb=\"28\"><\/div>\n\n            <div style=\"margin-top:.55rem;\">\n              Neurons in an area called the\n              <span class=\"blank\"><input type=\"text\" data-q=\"29\" data-type=\"text\" data-max=\"2\" placeholder=\"\u2264 TWO WORDS\" \/><\/span>\n              were more active very early before favourite moments \u2014 the period known as the\n              <span class=\"blank\"><input type=\"text\" data-q=\"30\" data-type=\"text\" data-max=\"2\" placeholder=\"\u2264 TWO WORDS\" \/><\/span>.\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"29\"><\/div>\n            <div class=\"icte-q__fb\" data-fb=\"30\"><\/div>\n\n            <div style=\"margin-top:.55rem;\">\n              Activity there is associated with expectation of \u2018reward\u2019 stimuli such as\n              <span class=\"blank\"><input type=\"text\" data-q=\"31\" data-type=\"text\" data-max=\"2\" placeholder=\"\u2264 TWO WORDS\" \/><\/span>.\n            <\/div>\n            <div class=\"icte-q__fb\" data-fb=\"31\"><\/div>\n          <\/div>\n        <\/div>\n\n        <!-- Q32\u201336 MCQ -->\n        <div class=\"icte-q\">\n          <div class=\"icte-q__label\">Questions 32\u201336 (Choose the correct letter, A, B, C or D)<\/div>\n\n          <div class=\"icte-mcq\">\n            <div class=\"icte-mcq__q\"><strong>32.<\/strong> What point does the writer emphasise in the first paragraph?<\/div>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q32\" data-q=\"32\" data-type=\"radio\" value=\"A\"> A<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q32\" data-q=\"32\" data-type=\"radio\" value=\"B\"> B<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q32\" data-q=\"32\" data-type=\"radio\" value=\"C\"> C<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q32\" data-q=\"32\" data-type=\"radio\" value=\"D\"> D<\/label>\n            <div class=\"icte-q__fb\" data-fb=\"32\"><\/div>\n          <\/div>\n\n          <div class=\"icte-mcq\">\n            <div class=\"icte-mcq__q\"><strong>33.<\/strong> What view of the Montreal study does the writer express in the second paragraph?<\/div>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q33\" data-q=\"33\" data-type=\"radio\" value=\"A\"> A<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q33\" data-q=\"33\" data-type=\"radio\" value=\"B\"> B<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q33\" data-q=\"33\" data-type=\"radio\" value=\"C\"> C<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q33\" data-q=\"33\" data-type=\"radio\" value=\"D\"> D<\/label>\n            <div class=\"icte-q__fb\" data-fb=\"33\"><\/div>\n          <\/div>\n\n          <div class=\"icte-mcq\">\n            <div class=\"icte-mcq__q\"><strong>34.<\/strong> What does the writer find interesting about the results of the Montreal study?<\/div>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q34\" data-q=\"34\" data-type=\"radio\" value=\"A\"> A<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q34\" data-q=\"34\" data-type=\"radio\" value=\"B\"> B<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q34\" data-q=\"34\" data-type=\"radio\" value=\"C\"> C<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q34\" data-q=\"34\" data-type=\"radio\" value=\"D\"> D<\/label>\n            <div class=\"icte-q__fb\" data-fb=\"34\"><\/div>\n          <\/div>\n\n          <div class=\"icte-mcq\">\n            <div class=\"icte-mcq__q\"><strong>35.<\/strong> Why does the writer refer to Meyer\u2019s work on music and emotion?<\/div>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q35\" data-q=\"35\" data-type=\"radio\" value=\"A\"> A<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q35\" data-q=\"35\" data-type=\"radio\" value=\"B\"> B<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q35\" data-q=\"35\" data-type=\"radio\" value=\"C\"> C<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q35\" data-q=\"35\" data-type=\"radio\" value=\"D\"> D<\/label>\n            <div class=\"icte-q__fb\" data-fb=\"35\"><\/div>\n          <\/div>\n\n          <div class=\"icte-mcq\">\n            <div class=\"icte-mcq__q\"><strong>36.<\/strong> According to Leonard Meyer, what causes the listener\u2019s emotional response to music?<\/div>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q36\" data-q=\"36\" data-type=\"radio\" value=\"A\"> A<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q36\" data-q=\"36\" data-type=\"radio\" value=\"B\"> B<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q36\" data-q=\"36\" data-type=\"radio\" value=\"C\"> C<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q36\" data-q=\"36\" data-type=\"radio\" value=\"D\"> D<\/label>\n            <div class=\"icte-q__fb\" data-fb=\"36\"><\/div>\n          <\/div>\n        <\/div>\n\n        <!-- Q37\u201340 Matching endings -->\n        <div class=\"icte-q\">\n          <div class=\"icte-q__label\">Questions 37\u201340 (Complete each sentence with the correct ending, A\u2013F)<\/div>\n          <div class=\"icte-note\">\n            <strong>Endings<\/strong>:\n            A our response depends on initial emotional state \u2022\n            B neuron activity decreases if outcomes become predictable \u2022\n            C emotive music can bring to mind actual pictures\/events \u2022\n            D past experiences influence emotional reaction \u2022\n            E emotive music delays giving listeners what they expect \u2022\n            F neuron activity increases prior to key points\n          <\/div>\n\n          <div class=\"icte-grid2\">\n            <div class=\"icte-day\">\n              <div><strong>37.<\/strong> The Montreal researchers discovered that<\/div>\n              <select data-q=\"37\" data-type=\"select\">\n                <option value=\"\">Select A\u2013F<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"37\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>38.<\/strong> Many studies have demonstrated that<\/div>\n              <select data-q=\"38\" data-type=\"select\">\n                <option value=\"\">Select A\u2013F<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"38\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>39.<\/strong> Meyer\u2019s analysis of Beethoven\u2019s music shows that<\/div>\n              <select data-q=\"39\" data-type=\"select\">\n                <option value=\"\">Select A\u2013F<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"39\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>40.<\/strong> Earlier theories of music suggested that<\/div>\n              <select data-q=\"40\" data-type=\"select\">\n                <option value=\"\">Select A\u2013F<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"40\"><\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n\n      <\/div>\n    <\/section>\n  <\/section>\n\n  <!-- \u2705 STYLES (scoped) -->\n  <style>\n    #icte-reading-test3, #icte-reading-test3 *{ box-sizing:border-box; }\n    #icte-reading-test3{ width:100%; max-width:100%; margin:0; }\n\n    #icte-reading-test3 .icte-menu{\n      width:100%; max-width:100%;\n      display:flex; flex-wrap:wrap; gap:.5rem; justify-content:center; align-items:center;\n      padding:.75rem .9rem; margin:0 0 1rem 0;\n      background:#16a34a; border-radius:14px; box-shadow:0 2px 8px rgba(0,0,0,.10);\n    }\n    #icte-reading-test3 .icte-menu a{\n      display:inline-block; text-decoration:none; font-weight:900; font-size:.95rem; color:#fff;\n      padding:.55rem .85rem; border-radius:999px; border:1px solid rgba(255,255,255,.35);\n      background:rgba(255,255,255,.12);\n    }\n    #icte-reading-test3 .icte-menu a.is-current{ background:#fff; color:#16a34a; border-color:#fff; }\n    @media (max-width:600px){\n      #icte-reading-test3 .icte-menu{ justify-content:flex-start; }\n      #icte-reading-test3 .icte-menu a{ width:100%; text-align:center; }\n    }\n\n    #icte-reading-test3 .icte-ielts{ width:100%; margin:1rem 0; }\n    #icte-reading-test3 .icte-ielts__intro{\n      padding:.9rem 1rem; border:1px solid rgba(0,0,0,.10); border-radius:14px;\n      background:rgba(255,255,255,.7); margin-bottom:1rem;\n    }\n    #icte-reading-test3 .icte-ielts__title{ margin:0 0 .35rem; font-size:1.2rem; font-weight:900; }\n    #icte-reading-test3 .icte-ielts__sub{ margin:0; opacity:.85; }\n\n    #icte-reading-test3 .icte-ielts__panel{\n      border:1px solid rgba(0,0,0,.10); border-radius:14px; background:rgba(255,255,255,.85);\n      overflow:hidden; margin-bottom:1rem;\n    }\n    #icte-reading-test3 .icte-ielts__panelHead{\n      display:flex; align-items:center; justify-content:space-between; gap:.75rem;\n      padding:.85rem 1rem; border-bottom:1px solid rgba(0,0,0,.08); background:rgba(0,0,0,.03);\n    }\n    #icte-reading-test3 .icte-ielts__h3{ margin:0; font-size:1.03rem; font-weight:900; }\n    #icte-reading-test3 .icte-ielts__headRight{ display:flex; gap:.55rem; align-items:center; }\n\n    #icte-reading-test3 .icte-ielts__reading{\n      padding:.95rem 1rem 1.05rem; line-height:1.75; max-height:520px; overflow:auto;\n      white-space:pre-wrap;\n    }\n\n    #icte-reading-test3 .icte-ielts__row{\n      display:flex; justify-content:space-between; gap:.75rem;\n      padding:.85rem 1rem .25rem;\n    }\n    #icte-reading-test3 .icte-ielts__control label{ display:block; margin-bottom:.35rem; }\n    #icte-reading-test3 select{\n      width:100%; max-width:520px; padding:.6rem .7rem; border-radius:12px;\n      border:1px solid rgba(0,0,0,.18); background:#fff; font:inherit;\n    }\n    #icte-reading-test3 .icte-ielts__score{\n      font-weight:900; font-size:.95rem; opacity:.9; white-space:nowrap;\n      margin-top:.25rem;\n    }\n\n    #icte-reading-test3 .icte-ielts__btnRow{\n      padding:.75rem 1rem 1rem; display:flex; gap:.6rem; flex-wrap:wrap; align-items:center;\n    }\n    #icte-reading-test3 .icte-ielts__btnRow--tight{ padding-top:0; }\n    #icte-reading-test3 .icte-ielts__btnGrid{\n      padding:.75rem 1rem 1rem;\n      display:grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap:.6rem;\n    }\n\n    #icte-reading-test3 .icte-link{\n      font-weight:900; text-decoration:none; border:1px solid rgba(0,0,0,.14);\n      border-radius:12px; padding:.55rem .75rem; color:inherit; background:rgba(255,255,255,.6);\n    }\n\n    #icte-reading-test3 .icte-ielts__qArea{ padding:.9rem 1rem 1rem; }\n    #icte-reading-test3 .icte-q{\n      padding:.75rem .8rem; border:1px solid rgba(0,0,0,.10); border-radius:12px;\n      background:rgba(255,255,255,.75); margin:0 0 .75rem;\n    }\n    #icte-reading-test3 .icte-q__label{ font-weight:900; display:block; margin-bottom:.4rem; }\n    #icte-reading-test3 .icte-note{ line-height:1.7; opacity:.95; }\n\n    #icte-reading-test3 .blank{\n      display:inline-flex; align-items:center; gap:.4rem;\n      padding:.15rem .35rem; border-radius:10px; border:1px dashed rgba(0,0,0,.25);\n      background:rgba(255,255,255,.6); margin:0 .25rem;\n    }\n    #icte-reading-test3 input[type=\"text\"]{\n      width:200px; max-width:100%;\n      padding:.55rem .65rem; border-radius:12px;\n      border:1px solid rgba(0,0,0,.18); font:inherit;\n    }\n    #icte-reading-test3 .icte-q__fb{ margin-top:.35rem; font-size:.95rem; font-weight:800; }\n\n    #icte-reading-test3 .icte-btn{\n      appearance:none; border:1px solid transparent; border-radius:12px;\n      padding:.65rem .85rem; font-weight:900; cursor:pointer; font:inherit;\n    }\n    #icte-reading-test3 .icte-btn--primary{ background:#16a34a; color:#fff; }\n    #icte-reading-test3 .icte-btn--info{ background:#0ea5e9; color:#fff; }\n    #icte-reading-test3 .icte-btn--danger{ background:#dc2626; color:#fff; }\n    #icte-reading-test3 .icte-btn--dark{ background:#334155; color:#fff; }\n    #icte-reading-test3 .icte-btn--ghost{ background:transparent; border-color:rgba(0,0,0,.20); color:inherit; }\n\n    #icte-reading-test3 .icte-loader{\n      width:18px; height:18px; border-radius:999px;\n      border:3px solid rgba(0,0,0,.15); border-top-color:#0ea5e9;\n      display:none; animation: icteSpin 1s linear infinite;\n    }\n    @keyframes icteSpin{ to{ transform: rotate(360deg); } }\n\n    #icte-reading-test3 .icte-ielts__helper{\n      padding:.95rem 1rem 1.05rem; line-height:1.7; overflow-wrap:anywhere; word-break:break-word;\n    }\n    #icte-reading-test3 .icte-ielts__helper ul{ margin:.4rem 0 0 1.1rem; }\n    #icte-reading-test3 .icte-ielts__helper li{ margin:.35rem 0; }\n    #icte-reading-test3 .icte-ielts__helper .tag{\n      display:inline-block; padding:.15rem .5rem; border-radius:999px;\n      border:1px solid rgba(0,0,0,.12); background:rgba(255,255,255,.7);\n      font-weight:900; font-size:.85rem; margin-right:.4rem;\n    }\n\n    #icte-reading-test3 .icte-mcq{\n      margin:.75rem 0 1rem; padding:.7rem .75rem;\n      border:1px solid rgba(0,0,0,.10); border-radius:12px; background:rgba(255,255,255,.65);\n    }\n    #icte-reading-test3 .icte-mcq__q{ font-weight:900; margin-bottom:.45rem; }\n    #icte-reading-test3 .icte-opt{ display:block; margin:.35rem 0; font-weight:700; }\n    #icte-reading-test3 .icte-opt input{ margin-right:.5rem; }\n\n    #icte-reading-test3 .icte-grid2{ display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:.75rem; }\n    #icte-reading-test3 .icte-day{\n      border:1px solid rgba(0,0,0,.10); border-radius:12px; background:rgba(255,255,255,.65);\n      padding:.7rem;\n    }\n    #icte-reading-test3 .icte-day select{ max-width:100%; }\n\n    @media (max-width: 900px){\n      #icte-reading-test3 .icte-ielts__btnGrid{ grid-template-columns: repeat(2, minmax(0, 1fr)); }\n      #icte-reading-test3 .icte-grid2{ grid-template-columns: 1fr; }\n    }\n    @media (max-width: 600px){\n      #icte-reading-test3 .icte-ielts__row{ flex-direction:column; align-items:stretch; }\n      #icte-reading-test3 .icte-ielts__btnGrid{ grid-template-columns: 1fr; }\n      #icte-reading-test3 input[type=\"text\"]{ width:100%; }\n    }\n  <\/style>\n\n  <!-- \u2705 SCRIPT -->\n  <script>\n    (function(){\n      const root = document.getElementById(\"icte-reading-test3\");\n      if (!root) return;\n\n      const $ = (sel, base=root) => base.querySelector(sel);\n      const $$ = (sel, base=root) => Array.from(base.querySelectorAll(sel));\n\n      function showLoader(show){\n        const el = $('[data-el=\"synthesis-loader\"]');\n        if (el) el.style.display = show ? \"inline-block\" : \"none\";\n      }\n\n      const speechOk = (\"speechSynthesis\" in window);\n      let voicesAll = [];\n      let voiceA = null;\n      let playRunId = 0;\n\n      function stopSpeaking(){\n        if (!speechOk) return;\n        playRunId++;\n        window.speechSynthesis.cancel();\n        showLoader(false);\n      }\n\n      function say(text, voice, opts){\n        const myRun = playRunId;\n        const options = opts || {};\n        return new Promise((resolve) => {\n          if (!speechOk) return resolve();\n\n          const u = new SpeechSynthesisUtterance(String(text || \"\"));\n          u.lang  = options.lang  || (voice && voice.lang) || \"en-US\";\n          u.rate  = (typeof options.rate === \"number\") ? options.rate : 1.0;\n          u.pitch = (typeof options.pitch === \"number\") ? options.pitch : 1.0;\n          if (voice) u.voice = voice;\n\n          let done = false;\n          const finish = () => {\n            if (done) return;\n            done = true;\n            clearInterval(timer);\n            u.onend = null;\n            u.onerror = null;\n            resolve();\n          };\n\n          u.onend = finish;\n          u.onerror = finish;\n\n          const timer = setInterval(() => {\n            if (done) return;\n            if (playRunId !== myRun) return finish();\n            const speaking = window.speechSynthesis.speaking;\n            const pending  = window.speechSynthesis.pending;\n            if (!speaking && !pending) finish();\n          }, 120);\n\n          window.speechSynthesis.speak(u);\n        });\n      }\n\n      function populateVoices(){\n        if (!speechOk) return;\n        voicesAll = window.speechSynthesis.getVoices() || [];\n        \/\/ \u2705 Keep ONLY Google voices + English US\/UK\nconst googleEnUSUK = voicesAll.filter(v => {\n  const name = (v.name || \"\").toLowerCase();\n  const lang = (v.lang || \"\").toLowerCase();\n\n  const isGoogle = name.includes(\"google\");\n  const isUSorUK = lang === \"en-us\" || lang === \"en-gb\";\n\n  return isGoogle && isUSorUK;\n});\n\n\/\/ fallback (in case user browser has no Google voices)\nconst usable = googleEnUSUK.length ? googleEnUSUK : voicesAll;\n\n\n        const selA = $('[data-el=\"voice-a\"]');\n        if (!selA) return;\n\n        selA.innerHTML = \"\";\n        usable.forEach((v, idx) => {\n          const o1 = document.createElement(\"option\");\n          o1.value = String(idx);\n          o1.textContent = `${v.name} (${v.lang})`;\n          selA.appendChild(o1);\n        });\n\n        voiceA = usable[0] || null;\n        if (voiceA){\n          const idx = usable.findIndex(v => v.name === voiceA.name && v.lang === voiceA.lang);\n          if (idx >= 0) selA.value = String(idx);\n        }\n        selA.onchange = () => { voiceA = usable[Number(selA.value)] || usable[0] || null; };\n      }\n\n      function loadVoices(){\n        if (!speechOk) return;\n        const got = window.speechSynthesis.getVoices();\n        if (got && got.length) populateVoices();\n        else window.speechSynthesis.onvoiceschanged = populateVoices;\n      }\n\n      function norm(x){\n        return String(x || \"\")\n          .trim()\n          .toLowerCase()\n          .replace(\/[-]\/g, \" \")\n          .replace(\/[.,!?;:()\"']\/g, \"\")\n          .replace(\/\\s+\/g, \" \");\n      }\n      function tokenCount(x){\n        const t = String(x || \"\").trim();\n        if (!t) return 0;\n        return t.split(\/\\s+\/).length;\n      }\n\n      function setFB(sectionEl, q, msg, color){\n        const fb = sectionEl.querySelector(`[data-fb=\"${q}\"]`);\n        if (!fb) return;\n        fb.textContent = msg || \"\";\n        fb.style.color = color || \"#0f172a\";\n      }\n\n      function setSectionScore(sectionEl, msg){\n        const box = $('[data-el=\"scoreBox\"]', sectionEl);\n        if (box) box.textContent = msg || \"\";\n        updateOverallScore();\n      }\n\n      function setHelper(sectionEl, builder){\n        const area = $('[data-el=\"helper-area\"]', sectionEl);\n        if (!area) return;\n        area.innerHTML = \"\";\n        builder(area);\n        area.scrollIntoView({ behavior:\"smooth\", block:\"start\" });\n      }\n      function clearSupport(sectionEl){\n        const area = $('[data-el=\"helper-area\"]', sectionEl);\n        if (area) area.innerHTML = 'Click <strong>Summary<\/strong>, <strong>Main ideas<\/strong>, or <strong>Keywords<\/strong>.';\n      }\n\n      function getUserAnswer(sectionEl, q){\n        const txt = sectionEl.querySelector(`input[data-q=\"${q}\"][type=\"text\"]`);\n        if (txt) return { value: String(txt.value || \"\"), kind: \"text\", el: txt };\n\n        const sel = sectionEl.querySelector(`select[data-q=\"${q}\"]`);\n        if (sel) return { value: String(sel.value || \"\"), kind: \"select\", el: sel };\n\n        const checked = sectionEl.querySelector(`input[type=\"radio\"][data-q=\"${q}\"]:checked`);\n        if (checked) return { value: String(checked.value || \"\"), kind: \"radio\", el: checked };\n\n        const anyRadio = sectionEl.querySelector(`input[type=\"radio\"][data-q=\"${q}\"]`);\n        if (anyRadio) return { value: \"\", kind: \"radio\", el: null };\n\n        return { value: \"\", kind: \"unknown\", el: null };\n      }\n\n      function clearInputs(sectionEl){\n        $$('input[type=\"text\"][data-q]', sectionEl).forEach(i => i.value = \"\");\n        $$('input[type=\"radio\"][data-q]', sectionEl).forEach(r => r.checked = false);\n        $$('select[data-q]', sectionEl).forEach(s => s.value = \"\");\n      }\n\n      function togglePassage(sectionEl){\n        const area = $('[data-el=\"passage-area\"]', sectionEl);\n        const btn = sectionEl.querySelector('button[data-action=\"toggle-passage\"]');\n        if (!area || !btn) return;\n\n        const isHidden = (area.style.display === \"none\");\n        area.style.display = isHidden ? \"block\" : \"none\";\n        btn.textContent = isHidden ? \"Hide Passage\" : \"Show Passage\";\n        if (isHidden) area.scrollIntoView({ behavior:\"smooth\", block:\"start\" });\n      }\n\n      function markCurrentMenu(){\n        const here = (location.href || \"\").replace(\/\\\/$\/, \"\");\n        root.querySelectorAll(\".icte-menu a\").forEach(a => {\n          const href = (a.href || \"\").replace(\/\\\/$\/, \"\");\n          if (href && (here === href || here.startsWith(href + \"\/\"))) a.classList.add(\"is-current\");\n        });\n      }\n\n      \/\/ ===== PASSAGES (Test 3) =====\n\/\/ \u2705 FULL PASSAGE TEXTS (Test 3)\nconst passages = {\n  p1: `Flying tortoises\nAn airborne reintroduction programme has helped conservationists take significant steps to protect the endangered Gal\u00e1pagos tortoise.\n\nA. Forests of spiny cacti cover much of the uneven lava plains that separate the interior of the Gal\u00e1pagos island of Isabela from the Pacific Ocean. With its five distinct volcanoes, the island resembles a lunar landscape. Only the thick vegetation at the skirt of the often cloud-covered peak of Sierra Negra offers respite from the barren terrain below. This inhospitable environment is home to the giant Galapagos tortoise. Some time after the Galapagos's birth, around five million years ago, the islands were colonised by one or more tortoises from mainland South America. As these ancestral tortoises settled on the individual islands, the different populations adapted to their unique environments, giving rise to at least 14 different subspecies. Island life agreed with them. In the absence of significant predators, they grew to become the largest and longest-living tortoises on the planet, weighing more than 400 kilograms, occasionally exceeding 1.8 metres in length and living for more than a century.\n\nB. Before human arrival, the archipelago's tortoises numbered in the hundreds of thousands. From the 17th century onwards, pirates took a few on board for food, but the arrival of whaling ships in the 1790s saw this exploitation grow exponentially. Relatively immobile and capable of surviving for months without food or water, the tortoises were taken on board these ships to act as food supplies during long ocean passages. Sometimes, their bodies were processed into high-grade oil. In total, an estimated 200,000 animals were taken from the archipelago before the 20th century. This historical exploitation was then exacerbated when settlers came to the islands. They hunted the tortoises and destroyed their habitat to clear land for agriculture. They also introduced alien species - ranging from cattle, pigs, goats, rats and dogs to plants and ants - that either prey on the eggs and young tortoises or damage or destroy their habitat.\n\nC. Today, only 11 of the original subspecies survive and of these, several are highly endangered. In 1989, work began on a tortoise-breeding centre just outside the town of Puerto Villamil on Isabela, dedicated to protecting the island's tortoise populations. The centre's captive-breeding programme proved to be extremely successful, and it eventually had to deal with an overpopulation problem.\n\nD. The problem was also a pressing one. Captive-bred tortoises can't be reintroduced into the wild until they're at least five years old and weigh at least 4.5 kilograms, at which point their size and weight and their hardened shells - are sufficient to protect them from predators. But if people wait too long after that point, the tortoises eventually become too large to transport.\n\nE. For years, repatriation efforts were carried out in small numbers, with the tortoises carried on the backs of men over weeks of long, treacherous hikes along narrow trails. But in November 2010, the environmentalist and Gal\u00e1pagos National Park liaison officer Godfrey Merlin, a visiting private motor yacht captain and a helicopter pilot gathered around a table in a small caf\u00e9 in Puerto Ayora on the island of Santa Cruz to work out more ambitious reintroduction. The aim was to use a helicopter to move 300 of the breeding centre's tortoises to various locations close to Sierra Negra.\n\nF. This unprecedented effort was made possible by the owners of the 67-metre yacht White Cloud, who provided the Galapagos National Park with free use of their helicopter and its experienced pilot, as well as the logistical support of the yacht, its captain and crew. Originally an air ambulance, the yacht's helicopter has a rear double door and a large internal space that's well suited for cargo, so a custom crate was designed to hold up to 33 tortoises with a total weight of about 150 kilograms. This weight, together with that of the fuel, pilot and four crew, approached the helicopter's maximum payload, and there were times when it was clearly right on the edge of the helicopter's capabilities. During a period of three days, a group of volunteers from the breeding centre worked around the clock to prepare the young tortoises for transport. Meanwhile, park wardens, dropped off ahead of time in remote locations, cleared landing sites within the thick brush, cacti and lava rocks.\n\nG. Upon their release, the juvenile tortoises quickly spread out over their ancestral territory, investigating their new surroundings and feeding on the vegetation. Eventually, one tiny tortoise came across a fully grown giant who had been lumbering around the island for around a hundred years. The two stood side by side, a powerful symbol of the regeneration of an ancient species.\n`,\n\n  p2: `READING PASSAGE 2\nYou should spend about 20 minutes on Questions 14-26, which are based on Reading Passage 2.\n\nThe Intersection of Health Sciences and Geography\n\nA. While many diseases that affect humans have been eradicated due to improvements in vaccinations and the availability of healthcare, there are still areas around the world where certain health issues are more prevalent. In a world that is far more globalised than ever before, people come into contact with one another through travel and living closer and closer to each other. As a result, super-viruses and other infections resistant to antibiotics are becoming more and more common.\n\nB. Geography can often play a very large role in the health concerns of certain populations. For instance, depending on where you live, you will not have the same health concerns as someone who lives in a different geographical region. Perhaps one of the most obvious examples of this idea is malaria-prone areas, which are usually tropical regions that foster a warm and damp environment in which the mosquitos that can give people this disease can grow. Malaria is much less of a problem in high-altitude deserts, for instance.\n\nC. In some countries, geographical factors influence the health and well-being of the population in very obvious ways. In many large cities, the wind is not strong enough to clear the air of the massive amounts of smog and pollution that cause asthma, lung problems, eyesight issues and more in the people who live there. Part of the problem is, of course, the massive number of cars being driven, in addition to factories that run on coal power. The rapid industrialisation of some countries in recent years has also led to the cutting down of forests to allow for the expansion of big cities, which makes it even harder to fight the pollution with the fresh air that is produced by plants.\n\nD. It is in situations like these that the field of health geography comes into its own. It is an increasingly important area of study in a world where diseases like polio are re-emerging, respiratory diseases continue to spread, and malaria-prone areas are still fighting to find a better cure. Health geography is the combination of, on the one hand, knowledge regarding geography and methods used to analyse and interpret geographical information, and on the other, the study of health, diseases and healthcare practices around the world. The aim of this hybrid science is to create solutions for common geography-based health problems. While people will always be prone to illness, the study of how geography affects our health could lead to the eradication of certain illnesses, and the prevention of others in the future. By understanding why and how we get sick, we can change the way we treat illness and disease specific to certain geographical locations.\n\nE. The geography of disease and ill health analyses the frequency with which certain diseases appear in different parts of the world, and overlays the data with the geography of the region, to see if there could be a correlation between the two. Health geographers also study factors that could make certain individuals or a population more likely to be taken ill with a specific health concern or disease, as compared with the population of another area. Health geographers in this field are usually trained as healthcare workers, and have an understanding of basic epidemiology as it relates to the spread of diseases among the population.\n\nF. Researchers study the interactions between humans and their environment that could lead to illness (such as asthma in places with high levels of pollution) and work to create a clear way of categorising illnesses, diseases and epidemics into local and global scales. Health geographers can map the spread of illnesses and attempt to identify the reasons behind an increase or decrease in illnesses, as they work to find a way to halt the further spread or re-emergence of diseases in vulnerable populations.\n\nG. The second subcategory of health geography is the geography of healthcare provision. This group studies the availability (or lack thereof) of healthcare resources to individuals and populations around the world. In both developed and developing nations there is often a very large discrepancy between the options available to people in different social classes, income brackets, and levels of education. Individuals working in the area of the geography of healthcare provision attempt to assess the levels of healthcare in the area (for instance, it may be very difficult for people to get medical attention because there is a mountain between their village and the nearest hospital). These researchers are on the frontline of making recommendations regarding policy to international organisations, local government bodies and others.\n\nH. The field of health geography is often overlooked, but it constitutes a huge area of need in the fields of geography and healthcare. If we can understand how geography affects our health no matter where in the world we are located, we can better treat disease, prevent illness, and keep people safe and well.\n`,\n\n  p3: `READING PASSAGE 3\nYou should spend about 20 minutes on Questions 27-40, which are based on Reading Passage 3.\n\nMusic and the emotions\nNeuroscientist Jonah Lehrer considers the emotional power of music\n\nWhy does music make us feel? On the one hand, music is a purely abstract art form, devoid of language or explicit ideas. And yet, even though music says little, it still manages to touch us deeply. When listening to our favourite songs, our body betrays all the symptoms of emotional arousal. The pupils in our eyes dilate, our pulse and blood pressure rise, the electrical conductance of our skin is lowered, and the cerebellum, a brain region associated with bodily movement, becomes strangely active. Blood is even re-directed to the muscles in our legs. In other words, sound stirs us at our biological roots.\n\nA recent paper in Nature Neuroscience by a research team in Montreal, Canada, marks an important step in revealing the precise underpinnings of the potent pleasurable stimulus' that is music. Although the study involves plenty of fancy technology, including functional magnetic resonance imaging (fMRI) and ligand-based positron emission tomography (PET) scanning, the experiment itself was rather straightforward. After screening 217 individuals who responded to advertisements requesting people who experience 'chills' to instrumental music, the scientists narrowed down the subject pool to ten. They then asked the subjects to bring in their playlist of favourite songs - virtually every genre was represented, from techno to tango and played them the music while their brain activity was monitored. Because the scientists were combining methodologies (PET and fMRI), they were able to obtain an impressively exact and detailed portrait of music in the brain.\n\nThe first thing they discovered is that music triggers the production of dopamine a chemical with a key role in setting people's moods - by the neurons (nerve cells) in both the dorsal and ventral regions of the brain. As these two regions have long been linked with the experience of pleasure, this finding isn't particularly surprising. What is rather more significant is the finding that the dopamine neurons in the caudate - a region of the brain involved in learning stimulus - response associations, and in anticipating food and other 'reward' stimuli - were at their most active around 15 seconds before the participants' favourite moments in the music. The researchers call this the 'anticipatory phase' and argue that the purpose of this activity is to help us predict the arrival of our favourite part.\n\nThe question, of course, is what all these dopamine neurons are up to. Why are they so active in the period preceding the acoustic climax? After all, we typically associate surges of dopamine with pleasure, with the processing of actual rewards. And yet, this cluster of cells is most active when the 'chills' have yet to arrive, when the melodic pattern is still unresolved.\n\nOne way to answer the question is to look at the music and not the neurons. While music can often seem (at least to the outsider) like a labyrinth of intricate patterns, it turns out that the most important part of every song or symphony is when the patterns break down, when the sound becomes unpredictable. If the music is too obvious, it is annoyingly boring, like an alarm clock. Numerous studies, after all, have demonstrated that dopamine neurons quickly adapt to predictable rewards. If we know what's going to happen next, then we don't get excited. This is why composers often introduce a key note in the beginning of a song, spend most of the rest of the piece in the studious avoidance of the pattern, and then finally repeat it only at the end. The longer we are denied the pattern we expect, the greater the emotional release when the pattern returns, safe and sound.\n\nTo demonstrate this psychological principle, the musicologist Leonard Meyer, in his classic book Emotion and Meaning in Music (1956), analysed the 5th movement of Beethoven's String Quartet in C-sharp minor, Op. 131. Meyer wanted to show how music is defined by its flirtation with - but not submission to our expectations of order. Meyer dissected 50 measures (bars) of the masterpiece, showing how Beethoven begins with the clear statement of a rhythmic and harmonic pattern and then, in an ingenious tonal dance, carefully holds off repeating it. What Beethoven does instead is suggest variations of the pattern. He wants to preserve an element of uncertainty in his music, making our brains beg for the one chord he refuses to give us. Beethoven saves that chord for the end.\n\nAccording to Meyer, it is the suspenseful tension of music, arising out of our unfulfilled expectations, that is the source of the music's feeling. While earlier theories of music focused on the way a sound can refer to the real world of images and experiences - its 'connotative' meaning - Meyer argued that the emotions we find in music come from the unfolding events of the music itself. This 'embodied meaning' arises from the patterns the symphony invokes and then ignores. It is this uncertainty that triggers the surge of dopamine in the caudate, as we struggle to figure out what will happen next. We can predict some of the notes, but we can't predict them all, and that is what keeps us listening, waiting expectantly for our reward, for the pattern to be completed.\n`\n};\n\n\n      \/\/ ===== Sections model + \u2705 ANSWER KEYS (from Answer key T3.pdf) =====\n      const sections = {\n        p1: {\n          title: \"Passage 1\",\n          qList: Array.from({length:13}, (_,i)=>i+1),\n          summary: \"Passage 1 describes the Gal\u00e1pagos tortoise, threats to its survival, and how conservationists carefully planned and carried out a reintroduction programme.\",\n          mainIdeas: [\n            { tag:\"Headings\", text:\"Choose the heading that best summarises the whole paragraph (not just one sentence).\" },\n            { tag:\"ONE WORD\", text:\"For notes completion, copy exactly ONE word from the passage.\" },\n            { tag:\"Scan\", text:\"Use keywords like pirates, whaling, settlers, and eggs to locate relevant lines quickly.\" }\n          ],\n          keywords: [\n            { term:\"reintroduction\", def:\"putting animals back into an area where they used to live\" },\n            { term:\"endangered\", def:\"at risk of extinction\" },\n            { term:\"whaling\", def:\"hunting whales\" },\n            { term:\"habitat\", def:\"natural home of an animal\" }\n          ],\n          passage: passages.p1,\n          answers: {\n            1:[\"v\"], 2:[\"iii\"], 3:[\"vii\"], 4:[\"i\"], 5:[\"iv\"], 6:[\"vi\"], 7:[\"ii\"],\n            8:[\"pirates\"],\n            9:[\"food\"],\n            10:[\"oil\"],\n            11:[\"settlers\"],\n            12:[\"species\"],\n            13:[\"eggs\"]\n          }\n        },\n        p2: {\n          title: \"Passage 2\",\n          qList: Array.from({length:13}, (_,i)=>i+14),\n          summary: \"Passage 2 explains how geography affects health, including disease distribution, environment, urbanisation, pollution, and access to healthcare.\",\n          mainIdeas: [\n            { tag:\"Match\", text:\"For Q14\u201319, match the idea to a paragraph letter A\u2013H.\" },\n            { tag:\"ONE WORD\", text:\"For Q20\u201326, use one exact word from the passage.\" },\n            { tag:\"Careful\", text:\"Look for signal examples: malaria deserts, pollution, mountains, hospitals.\" }\n          ],\n          keywords: [\n            { term:\"eradicated\", def:\"completely removed\" },\n            { term:\"pollution\", def:\"harmful contamination of the environment\" },\n            { term:\"pathogen\", def:\"disease-causing organism\" },\n            { term:\"access\", def:\"ability to reach or use services\" }\n          ],\n          passage: passages.p2,\n          answers: {\n            14:[\"D\"], 15:[\"C\"], 16:[\"F\"], 17:[\"G\"], 18:[\"D\"], 19:[\"B\"],\n            20:[\"vaccinations\",\"vaccination\"],\n            21:[\"antibiotics\",\"antibiotic\"],\n            22:[\"mosquitoes\",\"mosquito\"],\n            23:[\"factories\",\"factory\"],\n            24:[\"forests\",\"forest\"],\n            25:[\"polio\"],\n            26:[\"mountain\"]\n          }\n        },\n        p3: {\n          title: \"Passage 3\",\n          qList: Array.from({length:14}, (_,i)=>i+27),\n          summary: \"Passage 3 explores why music triggers strong emotions, using neuroscience research (dopamine\/reward) and Meyer\u2019s theory of expectation and delay in musical structure.\",\n          mainIdeas: [\n            { tag:\"\u2264 TWO\", text:\"For Q27\u201331, keep answers short (max TWO words) and copy from the text.\" },\n            { tag:\"MCQ\", text:\"For Q32\u201336, select A\u2013D only.\" },\n            { tag:\"Endings\", text:\"For Q37\u201340, match each sentence to the correct ending A\u2013F.\" }\n          ],\n          keywords: [\n            { term:\"dopamine\", def:\"a brain chemical linked to reward\" },\n            { term:\"anticipatory\", def:\"happening before something expected\" },\n            { term:\"expectation\", def:\"belief about what will happen next\" }\n          ],\n          passage: passages.p3,\n          answers: {\n            27:[\"dopamine\"],\n            28:[\"pleasure\"],\n            29:[\"caudate\"],\n            30:[\"anticipatory phase\",\"anticipation phase\"],\n            31:[\"food\"],\n            32:[\"B\"], 33:[\"C\"], 34:[\"A\"], 35:[\"B\"], 36:[\"D\"],\n            37:[\"F\"], 38:[\"B\"], 39:[\"E\"], 40:[\"C\"]\n          }\n        }\n      };\n\n      function renderPassages(){\n        Object.keys(sections).forEach(key => {\n          const secEl = root.querySelector(`[data-section=\"${key}\"]`);\n          if (!secEl) return;\n          const area = $('[data-el=\"passage-area\"]', secEl);\n          if (area) area.textContent = sections[key].passage || \"\";\n        });\n      }\n\n      async function readAloud(sectionKey){\n        if (!speechOk) return;\n        stopSpeaking();\n        const myRun = playRunId;\n        showLoader(true);\n\n        const sec = sections[sectionKey];\n        if (!sec) { showLoader(false); return; }\n\n        await say(\"Now read the passage.\", voiceA || null, { lang:\"en-US\" });\n        if (playRunId !== myRun) { showLoader(false); return; }\n\n        const text = String(sec.passage || \"\").replace(\/\\s+\/g,\" \").trim();\n        const chunks = [];\n        const max = 850;\n        for (let i=0; i<text.length; i+=max) chunks.push(text.slice(i, i+max));\n        for (const ch of chunks){\n          if (playRunId !== myRun) { showLoader(false); return; }\n          await say(ch, voiceA || null, { lang:\"en-US\", rate:1.0, pitch:1.0 });\n        }\n        showLoader(false);\n      }\n\n      function showSummary(sectionKey){\n        const secEl = root.querySelector(`[data-section=\"${sectionKey}\"]`);\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n\n        setHelper(secEl, (area) => {\n          const p = document.createElement(\"p\");\n          const tag = document.createElement(\"span\");\n          tag.className = \"tag\";\n          tag.textContent = \"Summary\";\n          p.appendChild(tag);\n          p.append(\" \" + sec.summary);\n          area.appendChild(p);\n        });\n\n        if (speechOk){\n          stopSpeaking();\n          showLoader(true);\n          say(\"Summary. \" + sec.summary, voiceA || null, { lang:\"en-US\" }).then(()=>showLoader(false));\n        }\n      }\n\n      function showMainIdeas(sectionKey){\n        const secEl = root.querySelector(`[data-section=\"${sectionKey}\"]`);\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n\n        setHelper(secEl, (area) => {\n          const p = document.createElement(\"p\");\n          const tag = document.createElement(\"span\");\n          tag.className = \"tag\";\n          tag.textContent = \"Main ideas\";\n          p.appendChild(tag);\n          p.append(\" Tips:\");\n          area.appendChild(p);\n\n          const ul = document.createElement(\"ul\");\n          sec.mainIdeas.forEach(i => {\n            const li = document.createElement(\"li\");\n            const t = document.createElement(\"span\");\n            t.className = \"tag\";\n            t.textContent = i.tag;\n            li.appendChild(t);\n            li.append(i.text);\n            ul.appendChild(li);\n          });\n          area.appendChild(ul);\n        });\n      }\n\n      function showKeywords(sectionKey){\n        const secEl = root.querySelector(`[data-section=\"${sectionKey}\"]`);\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n        const items = Array.isArray(sec.keywords) ? sec.keywords : [];\n\n        setHelper(secEl, (area) => {\n          const p = document.createElement(\"p\");\n          const tag = document.createElement(\"span\");\n          tag.className = \"tag\";\n          tag.textContent = \"Keywords\";\n          p.appendChild(tag);\n          p.append(\" Key vocabulary for this passage:\");\n          area.appendChild(p);\n\n          const ul = document.createElement(\"ul\");\n          items.forEach(k => {\n            const li = document.createElement(\"li\");\n            li.innerHTML = `<strong>${k.term}<\/strong>: ${k.def}`;\n            ul.appendChild(li);\n          });\n          area.appendChild(ul);\n        });\n      }\n\n      function enforceTextMaxTokens(el, raw){\n        const maxAttr = el && el.getAttribute && el.getAttribute(\"data-max\");\n        const max = maxAttr ? Number(maxAttr) : 0;\n        if (max > 0){\n          return tokenCount(raw) <= max;\n        }\n        return true;\n      }\n\n      function checkSection(sectionKey){\n        const secEl = root.querySelector(`[data-section=\"${sectionKey}\"]`);\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n\n        let correct = 0;\n        let graded = 0;\n\n        sec.qList.forEach(q => setFB(secEl, q, \"\", \"\"));\n\n        sec.qList.forEach(q => {\n          const got = getUserAnswer(secEl, q);\n          const raw = String(got.value || \"\").trim();\n\n          if (!raw){\n            setFB(secEl, q, \"Please answer this question.\", \"#8a5a00\");\n            return;\n          }\n\n          if (got.kind === \"text\" && got.el){\n            if (!enforceTextMaxTokens(got.el, raw)){\n              const mx = got.el.getAttribute(\"data-max\");\n              setFB(secEl, q, `\u26a0\ufe0f NO MORE THAN ${mx} WORD(S).`, \"#8a5a00\");\n              return;\n            }\n          }\n\n          const keyArr = (sec.answers && sec.answers[q]) ? sec.answers[q] : null;\n          if (!keyArr || !Array.isArray(keyArr) || keyArr.length === 0){\n            setFB(secEl, q, \"\u26a0\ufe0f Answer key not set yet.\", \"#8a5a00\");\n            return;\n          }\n\n          graded++;\n\n          const userNorm = norm(raw);\n          const ok = keyArr.some(a => norm(a) === userNorm);\n\n          if (ok){\n            correct++;\n            setFB(secEl, q, `\u2705 Correct`, \"#065f46\");\n          } else {\n            setFB(secEl, q, `\u274c Not correct. Correct answer: ${String(keyArr[0]).toUpperCase()}`, \"#991b1b\");\n          }\n        });\n\n        secEl.dataset.correct = String(correct);\n        secEl.dataset.total = String(graded);\n        setSectionScore(secEl, graded ? `Score: ${correct}\/${graded}` : \"Score: 0\/0\");\n\n        if (speechOk && graded){\n          showLoader(true);\n          say(`Your score for ${sec.title} is ${correct} out of ${graded}.`, voiceA || null, { lang:\"en-US\" })\n            .then(() => showLoader(false));\n        }\n      }\n\n      function showAnswers(sectionKey){\n        const secEl = root.querySelector(`[data-section=\"${sectionKey}\"]`);\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n\n        sec.qList.forEach(q => {\n          const keyArr = (sec.answers && sec.answers[q]) ? sec.answers[q] : null;\n          if (!keyArr || !Array.isArray(keyArr) || !keyArr.length){\n            setFB(secEl, q, \"Answer key not set.\", \"#8a5a00\");\n          } else {\n            setFB(secEl, q, `Correct answer: ${String(keyArr[0]).toUpperCase()}`, \"#0f172a\");\n          }\n        });\n\n        setSectionScore(secEl, \"Answers shown.\");\n      }\n\n      function resetSection(sectionKey){\n        const secEl = root.querySelector(`[data-section=\"${sectionKey}\"]`);\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n\n        clearInputs(secEl);\n        sec.qList.forEach(q => setFB(secEl, q, \"\", \"\"));\n        secEl.dataset.correct = \"0\";\n        secEl.dataset.total = \"0\";\n        setSectionScore(secEl, \"\");\n        clearSupport(secEl);\n        stopSpeaking();\n      }\n\n      function updateOverallScore(){\n        let totalC = 0, totalT = 0;\n        [\"p1\",\"p2\",\"p3\"].forEach(k => {\n          const el = root.querySelector(`[data-section=\"${k}\"]`);\n          if (!el) return;\n          const c = Number(el.dataset.correct || 0);\n          const t = Number(el.dataset.total || 0);\n          if (t > 0){ totalC += c; totalT += t; }\n        });\n        const box = $('[data-el=\"overallScoreBox\"]');\n        if (box){\n          box.textContent = totalT ? `Overall: ${totalC}\/${totalT}` : \"\";\n        }\n      }\n\n      function wire(){\n        root.addEventListener(\"click\", (e) => {\n          const btn = e.target.closest(\"button[data-action]\");\n          if (!btn) return;\n\n          const action = btn.getAttribute(\"data-action\");\n          const secEl = btn.closest(\"[data-section]\");\n          const sectionKey = secEl ? secEl.getAttribute(\"data-section\") : null;\n\n          if (action === \"stop-audio\") return stopSpeaking();\n          if (action === \"scroll-p1\") return document.getElementById(\"p1\")?.scrollIntoView({behavior:\"smooth\"});\n          if (action === \"scroll-p2\") return document.getElementById(\"p2\")?.scrollIntoView({behavior:\"smooth\"});\n          if (action === \"scroll-p3\") return document.getElementById(\"p3\")?.scrollIntoView({behavior:\"smooth\"});\n\n          if (!sectionKey) return;\n\n          if (action === \"toggle-passage\") return togglePassage(secEl);\n          if (action === \"read-aloud\") return readAloud(sectionKey);\n          if (action === \"check\") return checkSection(sectionKey);\n          if (action === \"show\") return showAnswers(sectionKey);\n          if (action === \"summary\") return showSummary(sectionKey);\n          if (action === \"main-ideas\") return showMainIdeas(sectionKey);\n          if (action === \"keywords\") return showKeywords(sectionKey);\n          if (action === \"reset\") return resetSection(sectionKey);\n          if (action === \"clear-support\") return clearSupport(secEl);\n        });\n      }\n\n      function init(){\n        loadVoices();\n        renderPassages();\n        wire();\n        markCurrentMenu();\n\n        [\"p1\",\"p2\",\"p3\"].forEach(k => {\n          const el = root.querySelector(`[data-section=\"${k}\"]`);\n          if (!el) return;\n          el.dataset.correct = \"0\";\n          el.dataset.total = \"0\";\n          clearSupport(el);\n          const area = $('[data-el=\"passage-area\"]', el);\n          const btn  = el.querySelector('button[data-action=\"toggle-passage\"]');\n          if (area) area.style.display = \"block\";\n          if (btn) btn.textContent = \"Hide Passage\";\n        });\n\n        updateOverallScore();\n      }\n\n      if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", init);\n      else init();\n    })();\n  <\/script>\n<\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>Overview Test 1 Test 2 Test 3 Test 4 Listening Speaking Writing IELTS Reading \u2013 Test 3 (Passages 1\u20133) Practice<\/p>\n","protected":false},"author":1,"featured_media":595,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_layout":"default_layout","footnotes":""},"categories":[25,26,32],"tags":[],"class_list":["post-608","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ielts","category-reading","category-test-3"],"_links":{"self":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/608","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/comments?post=608"}],"version-history":[{"count":2,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/608\/revisions"}],"predecessor-version":[{"id":617,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/608\/revisions\/617"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media\/595"}],"wp:attachment":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media?parent=608"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/categories?post=608"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/tags?post=608"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}