{"id":4955,"date":"2026-06-25T17:01:03","date_gmt":"2026-06-25T17:01:03","guid":{"rendered":"https:\/\/allenglish4u.com\/cambridge-flyers-2-test-3-listening\/"},"modified":"2026-07-05T02:43:16","modified_gmt":"2026-07-05T02:43:16","slug":"cambridge-flyers-2-test-3-listening","status":"publish","type":"page","link":"https:\/\/allenglish4u.com\/vi\/cambridge-flyers-2-test-3-listening\/","title":{"rendered":"Cambridge Flyers 2 &#8211; Test 3 &#8211; Listening"},"content":{"rendered":"\r\n<!--\r\n================================================================\r\nAE4U &#183; YLE FLYERS 2 &#8212; TEST 3 &#8212; LISTENING\r\n5 parts &#183; 25 questions &#183; ~25 mins\r\nPart 1: Pair \/ Draw lines (snow scene)\r\nPart 2: Listen and write (Sue \/ artist form)\r\nPart 3: Multiple matching A-H (Jim's mum's presents)\r\nPart 4: Picture MCQ (Jill's weekend)\r\nPart 5: Listen, colour and draw (park \/ river scene)\r\n================================================================\r\n-->\r\n<style>\r\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Plus+Jakarta+Sans:wght@400%3B500%3B600%3B700%3B800&family=Fraunces:opsz,wght@9..144,700&display=swap');\r\n\r\n.entry-content,.wp-block-post-content,.is-layout-constrained{max-width:none !important;width:auto !important;margin-left:0 !important;margin-right:0 !important;padding-left:0 !important;padding-right:0 !important;}\r\n.wp-block-post-title{display:none !important;}\r\n\r\n:root{\r\n  --accent-1:#10B981; --accent-2:#0EA5E9; --purple:#8B5CF6;\r\n  --gold:#FBBF24; --green:#10B981; --red:#EF4444;\r\n  --light-1:#ECFEFF; --light-2:#F0F9FF; --white:#FFFFFF;\r\n  --text:#0F172A; --muted:#475569; --subtle:#64748B; --border:#E2E8F0;\r\n  --dark-1:#0C1322;\r\n  --r-10:10px; --r-16:16px; --r-22:22px;\r\n  --sh-card:0 2px 8px rgba(0,0,0,.06); --sh-lg:0 12px 40px rgba(0,0,0,.12);\r\n}\r\n*{margin:0;padding:0;box-sizing:border-box}\r\nhtml{scroll-behavior:smooth}\r\nbody{font-family:'Plus Jakarta Sans',system-ui,sans-serif !important;color:var(--text);background:var(--light-2);-webkit-font-smoothing:antialiased;overflow-x:hidden}\r\n.serif{font-family:'Fraunces',Georgia,serif !important;font-weight:700;letter-spacing:-.01em}\r\n.wrap{max-width:1080px;margin:0 auto;padding:0 24px}\r\na{color:inherit;text-decoration:none}\r\nbutton{font-family:inherit !important;cursor:pointer;border:none;background:none}\r\n\r\n.header{position:fixed;top:0;left:0;right:0;z-index:100;transition:background .28s ease;border-bottom:1px solid transparent}\r\n.header.solid{background:rgba(255,255,255,.92);backdrop-filter:saturate(180%) blur(16px);border-bottom:1px solid var(--border)}\r\n.header-inner{display:flex;align-items:center;gap:28px;height:72px;max-width:1200px;margin:0 auto;padding:0 24px}\r\n.brand{display:flex;align-items:center;gap:11px;flex-shrink:0}\r\n.brand img{width:40px;height:40px;border-radius:11px;object-fit:cover;box-shadow:var(--sh-card)}\r\n.brand-name{font-weight:800;font-size:18px;color:#fff;transition:color .28s ease}\r\n.header.solid .brand-name{color:var(--text)}\r\n.nav{display:flex;align-items:center;gap:4px;margin-left:8px}\r\n.nav a{padding:9px 13px;font-size:14.5px;font-weight:600;color:rgba(255,255,255,.82);border-radius:var(--r-10);transition:all .16s ease}\r\n.nav a:hover{color:#fff;background:rgba(255,255,255,.08)}\r\n.header.solid .nav a{color:var(--muted)}\r\n.header.solid .nav a:hover{color:var(--text);background:var(--light-1)}\r\n.header-right{margin-left:auto;display:flex;align-items:center;gap:10px}\r\n.btn-back{display:inline-flex;align-items:center;gap:7px;padding:9px 16px;border-radius:999px;font-weight:700;font-size:14px;background:rgba(255,255,255,.14);color:#fff;border:1px solid rgba(255,255,255,.22)}\r\n.header.solid .btn-back{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));color:#fff;border-color:transparent}\r\n.hamburger{display:none;width:40px;height:40px;border-radius:50%;color:#fff;align-items:center;justify-content:center}\r\n.header.solid .hamburger{color:var(--text)}\r\n\r\n.hero{position:relative;min-height:300px;padding:110px 0 40px;background:linear-gradient(135deg,#10B981 0%,#0EA5E9 55%,#1E3A8A 100%);color:#fff;overflow:hidden}\r\n.hero::before{content:\"\";position:absolute;inset:0;background-image:radial-gradient(circle at 20% 30%,rgba(255,255,255,.15) 0%,transparent 50%),radial-gradient(circle at 80% 70%,rgba(255,255,255,.10) 0%,transparent 50%);pointer-events:none}\r\n.hero .wrap{position:relative;z-index:1}\r\n.kicker{display:inline-block;font-size:12px;letter-spacing:.18em;text-transform:uppercase;font-weight:700;opacity:.92;margin-bottom:14px}\r\n.hero h1{font-size:clamp(32px,5vw,48px);line-height:1.05;margin-bottom:14px}\r\n.hero h1 span{font-style:italic;color:var(--gold)}\r\n.hero p.sub{font-size:16px;line-height:1.6;max-width:680px;opacity:.95;margin-bottom:18px}\r\n.hero-meta{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:20px}\r\n.meta-pill{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:999px;background:rgba(255,255,255,.18);backdrop-filter:blur(6px);border:1px solid rgba(255,255,255,.24);font-size:13px;font-weight:600}\r\n.meta-pill .dot{width:6px;height:6px;border-radius:50%;background:var(--gold)}\r\n\r\n.player-bar{position:sticky;top:72px;z-index:50;background:#0F172A;color:#fff;box-shadow:0 4px 16px rgba(0,0,0,.2)}\r\n.player-inner{display:grid;grid-template-columns:340px 1fr;gap:20px;align-items:center;padding:14px 24px;max-width:1200px;margin:0 auto}\r\n.player-vid{aspect-ratio:16\/9;background:#000;border-radius:10px;overflow:hidden;width:340px;min-height:191px}\r\n.player-vid iframe{width:100%;height:100%;border:0;display:block}\r\n.player-controls h4{font-family:'Fraunces',serif !important;font-size:18px;margin-bottom:4px}\r\n.player-controls .pc-sub{font-size:13px;opacity:.75;margin-bottom:12px}\r\n.part-jumps{display:flex;flex-wrap:wrap;gap:8px}\r\n.jump-btn{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border-radius:999px;background:rgba(255,255,255,.1);color:#fff;font-weight:600;font-size:13px;border:1px solid rgba(255,255,255,.2);transition:all .15s ease;cursor:pointer}\r\n.jump-btn:hover{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));border-color:transparent;transform:translateY(-1px)}\r\n.jump-btn .jt{font-weight:800;color:var(--gold);font-size:12px}\r\n.jump-btn.active{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));border-color:transparent}\r\n.player-actions{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}\r\n.player-actions .ctrl-btn{display:inline-flex;align-items:center;gap:5px;padding:7px 12px;border-radius:8px;background:rgba(255,255,255,.08);color:#fff;font-size:12px;font-weight:600;border:1px solid rgba(255,255,255,.14);cursor:pointer}\r\n.player-actions .ctrl-btn:hover{background:rgba(255,255,255,.18)}\r\n\r\n.mini-prog{position:sticky;top:262px;z-index:40;background:rgba(255,255,255,.95);backdrop-filter:blur(10px);border-bottom:1px solid var(--border);padding:8px 0}\r\n.mini-prog-inner{display:flex;align-items:center;gap:14px}\r\n.mini-prog-bar{flex:1;height:6px;background:var(--light-1);border-radius:999px;overflow:hidden}\r\n.mini-prog-fill{height:100%;background:linear-gradient(90deg,var(--accent-1),var(--accent-2));border-radius:999px;transition:width .3s ease;width:0}\r\n.mini-prog-label{font-size:12px;color:var(--muted);font-weight:700;min-width:120px}\r\n.mini-prog-score{font-weight:800;color:var(--accent-1);font-size:14px;min-width:80px}\r\n\r\n.part-section{padding:48px 0;border-bottom:1px solid var(--border)}\r\n.part-section:nth-of-type(even){background:#fff}\r\n.part-head{display:flex;align-items:flex-start;gap:18px;margin-bottom:24px}\r\n.part-num{flex-shrink:0;width:60px;height:60px;border-radius:18px;background:linear-gradient(135deg,var(--accent-1),var(--accent-2));color:#fff;display:grid;place-items:center;font-family:'Fraunces',serif !important;font-weight:700;font-size:26px;box-shadow:0 8px 22px rgba(6,182,212,.3)}\r\n.part-head-text h2{font-size:26px;line-height:1.15;margin-bottom:6px}\r\n.part-head-text .qrange{display:inline-block;font-size:12.5px;font-weight:700;color:var(--accent-1);background:var(--light-1);padding:4px 10px;border-radius:999px;letter-spacing:.04em;margin-bottom:8px}\r\n.part-head-text p{color:var(--muted);font-size:15px;line-height:1.55;max-width:740px}\r\n.part-actions{display:flex;gap:10px;margin:0 0 16px 78px;flex-wrap:wrap}\r\n.act-pill{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:999px;background:#fff;border:1.5px solid var(--border);font-weight:600;font-size:13px;color:var(--text);cursor:pointer;transition:all .15s ease}\r\n.act-pill:hover{border-color:var(--accent-1);color:var(--accent-1)}\r\n\r\n\/* Common Q-item (used Part 3) *\/\r\n.q-list{display:flex;flex-direction:column;gap:18px;margin-top:8px}\r\n.q-item{background:#fff;border:1px solid var(--border);border-radius:16px;padding:18px 20px;display:flex;flex-direction:column;gap:12px;transition:all .2s ease;scroll-margin-top:330px}\r\n.q-item.correct{border-color:var(--green);box-shadow:0 0 0 3px rgba(16,185,129,.12)}\r\n.q-item.wrong{border-color:var(--red);box-shadow:0 0 0 3px rgba(239,68,68,.12)}\r\n.q-item.revealed{background:linear-gradient(180deg,#FEF3C7 0%,#FFFBF5 100%);border-color:var(--gold)}\r\n.q-text{font-size:15.5px;line-height:1.55;color:var(--text);display:flex;gap:10px;align-items:flex-start}\r\n.q-text b.qn{color:var(--accent-1);font-weight:800;min-width:30px}\r\n.feedback{font-size:13px;font-weight:600;display:none;padding:8px 12px;border-radius:8px;margin-top:4px}\r\n.q-item.answered .feedback,.q-item.revealed .feedback{display:block}\r\n.q-item.correct .feedback{background:rgba(16,185,129,.12);color:#065F46}\r\n.q-item.wrong .feedback{background:rgba(239,68,68,.10);color:#991B1B}\r\n.q-item.revealed .feedback{background:#FEF3C7;color:#7B5B00;border-left:3px solid var(--gold);padding-left:10px}\r\n.q-bottom{display:flex;justify-content:flex-end;gap:8px;margin-top:2px}\r\n.show-ans-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 13px;border-radius:999px;background:#FEF3C7;color:#7B5B00;font-weight:700;font-size:12px;border:1px solid #E8D88E;cursor:pointer;transition:all .15s ease}\r\n.show-ans-btn:hover{background:#FDE68A;transform:translateY(-1px)}\r\n\r\n\/* Part 3 &#8212; picture MCQ (3 boxes) *\/\r\n.pic-mcq{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:8px}\r\n.pic-opt{position:relative;border:2px solid var(--border);border-radius:14px;background:#fff;padding:8px;cursor:pointer;transition:all .15s ease;text-align:center}\r\n.pic-opt:hover{border-color:var(--accent-1);transform:translateY(-2px)}\r\n.pic-opt img{width:100%;height:auto;border-radius:8px;display:block;aspect-ratio:1\/1;object-fit:cover;background:#F8FAFC}\r\n.pic-opt .pic-letter{display:inline-flex;align-items:center;gap:6px;margin-top:8px;font-weight:700;color:var(--text);font-size:14px}\r\n.pic-opt .pic-letter b{display:grid;place-items:center;width:24px;height:24px;border-radius:6px;background:var(--light-1);color:var(--accent-1);font-size:13px;border:1px solid var(--border)}\r\n.pic-opt .pic-tick{width:18px;height:18px;border-radius:5px;border:2px solid var(--border);display:inline-grid;place-items:center;font-size:12px;color:transparent;background:#fff}\r\n.pic-opt.selected{border-color:var(--accent-1);background:linear-gradient(180deg,#fff,var(--light-1))}\r\n.pic-opt.selected .pic-tick{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));color:#fff;border-color:transparent}\r\n.pic-opt.correct-opt{border-color:var(--green) !important;background:rgba(16,185,129,.08) !important}\r\n.pic-opt.correct-opt .pic-tick{background:var(--green) !important;color:#fff !important;border-color:transparent !important}\r\n.pic-opt.wrong-opt{border-color:var(--red) !important;background:rgba(239,68,68,.08) !important}\r\n\r\n\/* Example row (smaller, opacity .7) *\/\r\n.ex-row{display:flex;gap:8px;align-items:center;background:var(--light-1);border:1.5px dashed var(--gold);border-radius:12px;padding:8px 12px;margin-bottom:10px;font-size:13px;font-weight:600;color:#7B5B00}\r\n.ex-row .ex-tag{background:var(--gold);color:#fff;padding:2px 8px;border-radius:6px;font-size:11px;letter-spacing:.06em}\r\n\r\n\/* Input blanks (Part 2) *\/\r\n.input-blank{display:inline-block;min-width:140px;border:none;border-bottom:2px dashed var(--accent-1);background:transparent;font-family:inherit !important;font-size:15.5px;color:var(--text);font-weight:600;padding:2px 8px;margin:0 4px;text-align:center;outline:none}\r\n.input-blank:focus{border-bottom-style:solid;background:var(--light-1)}\r\n.input-blank.correct{border-bottom-color:var(--green);color:#065F46;background:rgba(16,185,129,.10)}\r\n.input-blank.wrong{border-bottom-color:var(--red);color:#991B1B;background:rgba(239,68,68,.08)}\r\n.input-blank.revealed{border-bottom-color:var(--gold);background:#FEF3C7;color:#7B5B00}\r\n\r\n.form-card{background:#fff;border:1.5px solid var(--border);border-radius:16px;padding:22px;margin-top:14px;max-width:640px}\r\n.form-card h4{font-family:'Fraunces',serif !important;font-size:18px;color:var(--accent-2);margin-bottom:6px;border-bottom:2px solid var(--accent-1);padding-bottom:8px;display:inline-block;width:100%;text-align:center}\r\n.form-row{display:flex;gap:12px;align-items:center;margin-top:12px;flex-wrap:wrap}\r\n.form-row label{flex:0 0 240px;font-weight:600;color:var(--text);font-size:14.5px}\r\n.form-row .input-blank{flex:1;min-width:180px;text-align:left;font-size:14.5px}\r\n.form-row .show-ans-btn{flex-shrink:0;margin-left:auto}\r\n.form-row.example{opacity:.7}\r\n.form-row.example .ex-tag{background:var(--gold);color:#fff;padding:2px 8px;border-radius:6px;font-size:11px;letter-spacing:.06em;margin-left:6px}\r\n\r\n\/* PART 1 &#8212; Pair \/ Draw Lines *\/\r\n.pair-wrap{position:relative;background:#fff;border:1.5px solid var(--border);border-radius:16px;padding:14px;margin-top:14px;display:grid;grid-template-columns:200px 1fr;gap:18px;align-items:stretch;min-height:520px}\r\n.pair-names{display:flex;flex-direction:column;gap:10px;padding-right:6px;border-right:1px dashed var(--border)}\r\n.pair-name{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 12px;background:#F8FAFC;border:2px solid var(--border);border-radius:10px;cursor:pointer;font-weight:700;color:var(--text);transition:all .15s ease;user-select:none}\r\n.pair-name:hover{border-color:var(--accent-1);background:var(--light-1)}\r\n.pair-name.selected{border-color:var(--accent-1);background:linear-gradient(100deg,rgba(6,182,212,.12),rgba(14,165,233,.12));box-shadow:0 0 0 3px rgba(6,182,212,.18)}\r\n.pair-name.example{opacity:.55;cursor:default;border-style:dashed}\r\n.pair-name.example:hover{border-color:var(--gold);background:#FEF3C7}\r\n.pair-name.matched{border-color:var(--green);background:rgba(16,185,129,.08)}\r\n.pair-name .pn-dot{width:14px;height:14px;border-radius:50%;background:#fff;border:2px solid currentColor;flex-shrink:0}\r\n.pair-name .pn-num{font-size:13px;color:var(--accent-1);background:var(--light-1);width:22px;height:22px;border-radius:6px;display:grid;place-items:center;border:1px solid var(--border);flex-shrink:0}\r\n.pair-scene{position:relative;border:1px solid var(--border);border-radius:12px;overflow:hidden;background:#FAFBFC}\r\n.pair-scene img{width:100%;height:auto;display:block}\r\n.pair-targets,.pair-lines{position:absolute;inset:0;pointer-events:none}\r\n.pair-targets .tgt{position:absolute;width:32px;height:32px;border-radius:50%;background:rgba(6,182,212,.2);border:2px solid var(--accent-1);transform:translate(-50%,-50%);pointer-events:auto;cursor:pointer;transition:all .15s ease}\r\n.pair-targets .tgt:hover{background:rgba(6,182,212,.5);transform:translate(-50%,-50%) scale(1.15)}\r\n.pair-targets .tgt.example{background:rgba(251,191,36,.3);border-color:var(--gold);cursor:default}\r\n.pair-targets .tgt.matched{background:rgba(16,185,129,.45);border-color:var(--green)}\r\n.pair-targets .tgt .tlabel{position:absolute;left:50%;top:100%;transform:translate(-50%,4px);background:#0F172A;color:#fff;font-size:10px;padding:2px 6px;border-radius:4px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .15s ease}\r\n.pair-targets .tgt:hover .tlabel{opacity:1}\r\n.pair-lines{z-index:2}\r\n.pair-hint{font-size:12.5px;color:var(--muted);text-align:center;margin-top:10px;background:var(--light-1);border:1px solid var(--border);border-radius:8px;padding:8px 12px}\r\n.pair-bottom-actions{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap;justify-content:flex-end}\r\n@media (max-width:720px){\r\n  .pair-wrap{grid-template-columns:1fr;min-height:auto}\r\n  .pair-names{border-right:none;border-bottom:1px dashed var(--border);padding-right:0;padding-bottom:10px}\r\n}\r\n\r\n\r\n.match-letter{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#fff;border:1.5px solid var(--border);border-radius:12px;font-size:14px;font-weight:600;color:var(--text)}\r\n.match-letter b{color:var(--accent-1);background:var(--light-1);width:26px;height:26px;border-radius:8px;display:grid;place-items:center;flex-shrink:0;font-weight:800}\r\n.q-opts{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}\r\n.opt{display:inline-flex;align-items:center;gap:7px;padding:10px 16px;border-radius:12px;background:#F8FAFF;border:1.5px solid var(--border);font-weight:600;font-size:14px;color:var(--text);cursor:pointer;transition:all .15s ease;user-select:none}\r\n.opt input{display:none}\r\n.opt .opt-letter{font-weight:800;color:var(--accent-1);background:#fff;width:22px;height:22px;border-radius:6px;display:grid;place-items:center;font-size:12.5px;border:1px solid var(--border);flex-shrink:0}\r\n.opt.selected{background:linear-gradient(100deg,rgba(16,185,129,.12),rgba(14,165,233,.12));border-color:var(--accent-1)}\r\n.opt.selected .opt-letter{background:linear-gradient(100deg,var(--accent-1),var(--accent-2));color:#fff;border-color:transparent}\r\n.opt.correct-opt{background:rgba(16,185,129,.12) !important;border-color:var(--green) !important}\r\n.opt.correct-opt .opt-letter{background:var(--green) !important;color:#fff !important;border-color:transparent !important}\r\n.opt.wrong-opt{background:rgba(239,68,68,.10) !important;border-color:var(--red) !important}\r\n\r\n\/* PART 4 &#8212; Colour palette + SVG scene *\/\r\n.colour-wrap{background:#fff;border:1.5px solid var(--border);border-radius:16px;padding:14px;margin-top:14px}\r\n.colour-palette{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;padding:10px;background:var(--light-1);border-radius:10px;margin-bottom:12px}\r\n.swatch{width:42px;height:42px;border-radius:50%;border:3px solid #fff;box-shadow:0 0 0 2px var(--border);cursor:pointer;transition:all .15s ease;position:relative}\r\n.swatch:hover{transform:translateY(-2px)}\r\n.swatch.selected{box-shadow:0 0 0 3px var(--accent-1),0 6px 16px rgba(6,182,212,.4);transform:scale(1.1)}\r\n.swatch.eraser{background:repeating-conic-gradient(#fff 0% 25%,#E2E8F0 25% 50%) 50% \/ 16px 16px}\r\n.swatch .sw-label{position:absolute;left:50%;top:100%;transform:translate(-50%,4px);font-size:11px;font-weight:700;color:var(--muted);white-space:nowrap;text-transform:capitalize}\r\n.colour-scene{position:relative;text-align:center;background:#FAFBFC;border-radius:10px;padding:14px;border:1px solid var(--border)}\r\n.colour-scene svg{max-width:100%;height:auto}\r\n.colour-scene svg [data-region]{cursor:pointer;transition:fill .15s ease;stroke:#0F172A;stroke-width:1.5}\r\n.colour-scene svg [data-region]:hover{filter:brightness(0.9)}\r\n.colour-scene svg [data-region][data-locked=\"1\"]{cursor:not-allowed}\r\n.colour-scene .p5real{position:relative;display:inline-block;max-width:700px;width:100%}\r\n.colour-scene .p5img{display:block;width:100%;height:auto;border-radius:10px;border:1px solid var(--border)}\r\n.colour-scene .p5ovl{position:absolute;inset:0;width:100%;height:100%;max-width:none}\r\n.colour-scene .p5ovl [data-region]{cursor:pointer;fill-opacity:.5;stroke:#2563EB;stroke-width:.5;stroke-dasharray:2 1.4;transition:fill-opacity .15s,stroke-width .15s}\r\n.colour-scene .p5ovl [data-region]:hover{stroke-width:1;fill-opacity:.32}\r\n.colour-scene .p5ovl [data-region][data-locked=\"1\"]{cursor:not-allowed}\r\n.colour-instructions{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:10px;margin-top:14px}\r\n.col-ins{display:flex;align-items:center;gap:10px;padding:10px 14px;background:#fff;border:1.5px solid var(--border);border-radius:12px;font-size:13.5px;color:var(--text);font-weight:600}\r\n.col-ins.example{opacity:.7;border-style:dashed;background:#FEF3C7;border-color:var(--gold)}\r\n.col-ins .ci-num{display:grid;place-items:center;width:26px;height:26px;border-radius:8px;background:var(--light-1);color:var(--accent-1);font-weight:800;font-size:13px;border:1px solid var(--border);flex-shrink:0}\r\n.col-ins .ci-dot{width:18px;height:18px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 2px var(--border);flex-shrink:0;margin-left:auto}\r\n.col-ins.correct{border-color:var(--green);background:rgba(16,185,129,.06)}\r\n.col-ins.wrong{border-color:var(--red);background:rgba(239,68,68,.06)}\r\n.col-ins.revealed{background:#FEF3C7;border-color:var(--gold);color:#7B5B00}\r\n\r\n\/* Transcript *\/\r\n.transcript-card{margin-top:18px;background:#FAFBFC;border:1.5px solid var(--border);border-radius:14px;padding:0;overflow:hidden;max-width:840px}\r\n.transcript-card.collapsed .ts-body{display:none}\r\n.transcript-card .ts-head{display:flex;justify-content:space-between;align-items:center;padding:12px 18px;background:#fff;cursor:pointer;font-weight:700;font-size:14px;color:var(--accent-2);border-bottom:1px solid var(--border)}\r\n.transcript-card.collapsed .ts-head{border-bottom:none}\r\n.transcript-card .ts-head .chev{transition:transform .2s ease}\r\n.transcript-card.collapsed .ts-head .chev{transform:rotate(-90deg)}\r\n.transcript-card .ts-body{padding:16px 22px;font-size:14.5px;line-height:1.75;color:var(--text);max-height:380px;overflow-y:auto;background:#FAFBFC;font-family:'Courier New',monospace}\r\n.transcript-card .ts-body b{color:var(--accent-2);font-family:'Plus Jakarta Sans',sans-serif}\r\n.transcript-card .ts-body i{color:var(--muted);font-size:12.5px}\r\n\r\n\/* Notes pad *\/\r\n.notes-pad{background:#FEF9E7;border:1.5px solid var(--gold);border-radius:14px;padding:14px 18px;margin-top:14px;max-width:640px}\r\n.notes-pad label{display:block;font-weight:700;font-size:13px;color:#7B5B00;margin-bottom:6px;text-transform:uppercase;letter-spacing:.05em}\r\n.notes-pad textarea{width:100%;min-height:80px;padding:10px;font-family:inherit !important;font-size:14px;line-height:1.5;border:1px solid #E8D88E;border-radius:8px;background:rgba(255,255,255,.7);color:var(--text);outline:none;resize:vertical}\r\n.notes-pad textarea:focus{border-color:var(--accent-1);background:#fff}\r\n\r\n\/* Submit panel *\/\r\n.submit-panel{margin:40px auto 24px;background:linear-gradient(135deg,#10B981 0%,#0EA5E9 100%);color:#fff;padding:30px;border-radius:22px;text-align:center;max-width:720px;box-shadow:0 16px 50px rgba(6,182,212,.3)}\r\n.submit-panel h3{font-family:'Fraunces',serif !important;font-size:24px;margin-bottom:8px}\r\n.submit-panel p.intro{opacity:.95;margin-bottom:18px;font-size:14.5px}\r\n.submit-panel .sp-buttons{display:flex;gap:14px;justify-content:center;flex-wrap:wrap}\r\n.btn-submit-big{display:inline-flex;align-items:center;gap:8px;padding:14px 28px;border-radius:999px;background:#fff;color:var(--accent-2);font-weight:800;font-size:16px;box-shadow:0 8px 24px rgba(0,0,0,.2);cursor:pointer;transition:transform .15s ease}\r\n.btn-submit-big:hover{transform:translateY(-2px)}\r\n.btn-reset-big{padding:14px 24px;border-radius:999px;background:rgba(255,255,255,.18);color:#fff;font-weight:700;font-size:14.5px;border:1px solid rgba(255,255,255,.4);cursor:pointer}\r\n.btn-reset-big:hover{background:rgba(255,255,255,.3)}\r\n\r\n.results-banner{display:none;margin:24px auto;padding:30px;border-radius:22px;background:#fff;color:var(--text);text-align:center;max-width:720px;box-shadow:var(--sh-lg);border:2px solid var(--accent-1)}\r\n.results-banner.show{display:block}\r\n.results-banner h3{font-size:28px;font-family:'Fraunces',serif !important;margin-bottom:8px;color:var(--accent-2)}\r\n.results-banner .score-big{font-size:60px;font-weight:800;line-height:1;margin:14px 0;font-family:'Fraunces',serif !important;background:linear-gradient(100deg,var(--accent-1),var(--accent-2));-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}\r\n.results-banner p{font-size:15px;color:var(--muted)}\r\n.score-parts{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin-top:16px;background:var(--light-1);padding:12px;border-radius:12px}\r\n.score-parts .sp-item{text-align:center;font-size:12px;font-weight:600;color:var(--text)}\r\n.score-parts .sp-item b{display:block;font-size:18px;font-family:'Fraunces',serif !important;margin-bottom:2px;color:var(--accent-1)}\r\n\r\n.footer{background:var(--dark-1);color:#9CA3AF;padding:36px 0;text-align:center;font-size:13.5px}\r\n.footer a{color:var(--gold);font-weight:600}\r\n\r\n@media (max-width:880px){\r\n  .nav{display:none}\r\n  .hamburger{display:flex}\r\n  .player-inner{grid-template-columns:1fr;padding:12px 18px}\r\n  .player-vid{width:100%;min-height:0}\r\n  .hero{padding:110px 0 30px}\r\n  .part-actions{margin-left:0}\r\n  .form-row label{flex:1 1 100%}\r\n  .form-row .input-blank{width:100%}\r\n  .mini-prog{top:auto;position:relative}\r\n  .part-head{flex-direction:column;gap:10px}\r\n  .part-num{width:50px;height:50px;font-size:22px}\r\n  .pic-mcq{grid-template-columns:1fr 1fr 1fr;gap:8px}\r\n}\r\n\r\n.drawer{position:fixed;inset:0;background:rgba(15,23,42,.65);z-index:200;display:none;align-items:flex-start;justify-content:flex-end}\r\n.drawer.open{display:flex}\r\n.drawer-panel{width:280px;background:#fff;height:100%;padding:24px;display:flex;flex-direction:column;gap:8px}\r\n.drawer-panel a{padding:12px 14px;border-radius:10px;font-weight:600;color:var(--text)}\r\n.drawer-panel a:hover{background:var(--light-1)}\r\n.drawer-close{align-self:flex-end;width:40px;height:40px;border-radius:50%;display:grid;place-items:center;color:var(--muted)}\r\n<\/style>\r\n\r\n<header class=\"header\" id=\"hdr\">\r\n  <div class=\"header-inner\">\r\n    <a href=\"https:\/\/allenglish4u.com\" class=\"brand\">\r\n      <img decoding=\"async\" src=\"https:\/\/allenglish4u.com\/wp-content\/uploads\/2026\/04\/Transparent-background-MacBook-Pro-cua-Hang.png\" alt=\"AE4U\">\r\n      <span class=\"brand-name\">All English 4U<\/span>\r\n    <\/a>\r\n    <nav class=\"nav\">\r\n      <a href=\"https:\/\/allenglish4u.com\/grammar\/\">Grammar<\/a>\r\n      <a href=\"https:\/\/allenglish4u.com\/ielts\/\">IELTS<\/a>\r\n      <a href=\"https:\/\/allenglish4u.com\/toefl\/\">TOEFL<\/a>\r\n      <a href=\"https:\/\/allenglish4u.com\/cambridge\/\" class=\"active\">Cambridge<\/a>\r\n      <a href=\"https:\/\/allenglish4u.com\/celpip\/\">CELPIP<\/a>\r\n      <a href=\"https:\/\/allenglish4u.com\/dictation\/\">Dictation<\/a>\r\n      <\/nav>\r\n    <div class=\"header-right\">\r\n      <a href=\"https:\/\/allenglish4u.com\/cambridge\/\" class=\"btn-back\">\r\n        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\"><path d=\"M19 12H5M11 18l-6-6 6-6\"\/><\/svg>\r\n        Back\r\n      <\/a>\r\n      <button class=\"hamburger\" id=\"hamb\" aria-label=\"Menu\">\r\n        <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.3\" stroke-linecap=\"round\"><path d=\"M3 6h18M3 12h18M3 18h18\"\/><\/svg>\r\n      <\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/header>\r\n\r\n<div class=\"drawer\" id=\"drawer\">\r\n  <div class=\"drawer-panel\">\r\n    <button class=\"drawer-close\" id=\"drawerClose\" aria-label=\"Close\">\r\n      <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.3\" stroke-linecap=\"round\"><path d=\"M18 6L6 18M6 6l12 12\"\/><\/svg>\r\n    <\/button>\r\n    <a href=\"https:\/\/allenglish4u.com\/grammar\/\">Grammar<\/a>\r\n    <a href=\"https:\/\/allenglish4u.com\/ielts\/\">IELTS<\/a>\r\n    <a href=\"https:\/\/allenglish4u.com\/toefl\/\">TOEFL<\/a>\r\n    <a href=\"https:\/\/allenglish4u.com\/cambridge\/\">Cambridge<\/a>\r\n    <a href=\"https:\/\/allenglish4u.com\/celpip\/\">CELPIP<\/a>\r\n    <a href=\"https:\/\/allenglish4u.com\/dictation\/\">Dictation<\/a>\r\n    <\/div>\r\n<\/div>\r\n\r\n<section class=\"hero\">\r\n  <div class=\"wrap\">\r\n    <span class=\"kicker\">Cambridge YLE &#183; Flyers<\/span>\r\n    <h1 class=\"serif\">Flyers 2 &mdash; Test 3 <span>Listening<\/span><\/h1>\r\n    <p class=\"sub\">Listen to 5 parts with 25 questions. Use YouTube audio, jump to each part, take notes. Each question has its own <b>Show Answer<\/b> button &mdash; submit panel is at the <b>bottom<\/b>.<\/p>\r\n    <div class=\"hero-meta\">\r\n      <span class=\"meta-pill\"><span class=\"dot\"><\/span>~25 minutes<\/span>\r\n      <span class=\"meta-pill\"><span class=\"dot\"><\/span>5 Parts &middot; 25 Questions<\/span>\r\n      <span class=\"meta-pill\"><span class=\"dot\"><\/span>Auto-grade + Show Answer<\/span>\r\n      <span class=\"meta-pill\"><span class=\"dot\"><\/span>Pair &middot; Write &middot; Match &middot; Tick &middot; Colour<\/span>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<div class=\"player-bar\" id=\"playerBar\">\r\n  <div class=\"player-inner\">\r\n    <div class=\"player-vid\">\r\n      <iframe id=\"ytPlayer\" src=\"https:\/\/www.youtube.com\/embed\/qTyUY4r9OjQ?enablejsapi=1&#038;rel=0\" title=\"YLE Flyers Listening\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\r\n    <\/div>\r\n    <div class=\"player-controls\">\r\n      <h4>&#127911; Audio &mdash; Flyers 2 Test 3 Listening<\/h4>\r\n      <div class=\"pc-sub\">Click a part to jump in audio. Submit panel is at the bottom of this page.<\/div>\r\n      <div class=\"part-jumps\">\r\n        <button class=\"jump-btn\" data-time=\"0\" data-part=\"intro\"><span class=\"jt\">0:00<\/span> Intro<\/button>\r\n        <button class=\"jump-btn\" data-time=\"30\" data-part=\"1\"><span class=\"jt\">0:30<\/span> Part 1<\/button>\r\n        <button class=\"jump-btn\" data-time=\"300\" data-part=\"2\"><span class=\"jt\">5:00<\/span> Part 2<\/button>\r\n        <button class=\"jump-btn\" data-time=\"540\" data-part=\"3\"><span class=\"jt\">9:00<\/span> Part 3<\/button>\r\n        <button class=\"jump-btn\" data-time=\"780\" data-part=\"4\"><span class=\"jt\">13:00<\/span> Part 4<\/button>\r\n        <button class=\"jump-btn\" data-time=\"1000\" data-part=\"5\"><span class=\"jt\">16:40<\/span> Part 5<\/button>\r\n      <\/div>\r\n      <div class=\"player-actions\">\r\n        <button class=\"ctrl-btn\" id=\"btnPause\">&#9208; Pause<\/button>\r\n        <button class=\"ctrl-btn\" id=\"btnPlay\">&#9654; Play<\/button>\r\n        <button class=\"ctrl-btn\" id=\"btnRewind\">&#9194; -10s<\/button>\r\n        <button class=\"ctrl-btn\" id=\"btnSlower\">&#128034; Slower<\/button>\r\n        <button class=\"ctrl-btn\" id=\"btnNormal\">&#9889; Normal<\/button>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"mini-prog\" id=\"miniProg\">\r\n  <div class=\"wrap mini-prog-inner\">\r\n    <div class=\"mini-prog-score\">Score <span id=\"scoreNow\">0<\/span>\/25<\/div>\r\n    <div class=\"mini-prog-bar\"><div class=\"mini-prog-fill\" id=\"progFill\"><\/div><\/div>\r\n    <div class=\"mini-prog-label\"><span id=\"answeredCount\">0<\/span> of 25 answered<\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- ============ PART 1 &#8212; Pair \/ Draw Lines ============ -->\r\n<section class=\"part-section\" id=\"part1\">\r\n  <div class=\"wrap\">\r\n    <div class=\"part-head\">\r\n      <div class=\"part-num\">1<\/div>\r\n      <div class=\"part-head-text\">\r\n        <span class=\"qrange\">Questions 1&#8211;5 &#183; Pair \/ Draw lines<\/span>\r\n        <h2 class=\"serif\">Listen and draw lines<\/h2>\r\n        <p>Listen and draw lines between the names and the children in the snow picture. There is one example.<\/p>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"part-actions\">\r\n      <button class=\"act-pill\" data-time=\"30\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 1<\/button>\r\n      <button class=\"act-pill ts-toggle\" data-target=\"ts1\">&#128220; Transcript<\/button>\r\n      <button class=\"act-pill\" id=\"p1Clear\">&#129529; Clear my lines<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"pair-wrap\" id=\"pairWrap\">\r\n      <div class=\"pair-names\" id=\"pairNames\"><\/div>\r\n      <div class=\"pair-scene\" id=\"pairScene\">\r\n        <img decoding=\"async\" id=\"pairImg\" src=\"\/wp-content\/uploads\/2026\/06\/f2t3-p1-scene-1.jpg\" alt=\"Part 1 snow scene\" draggable=\"false\">\r\n        <svg class=\"pair-lines\" id=\"pairLines\" preserveAspectRatio=\"none\"><defs><\/defs><\/svg>\r\n        <div class=\"pair-targets\" id=\"pairTargets\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"pair-hint\">&#128161; Click a name on the left, then click the matching child in the picture. Click a line again to erase it.<\/div>\r\n    <div class=\"pair-bottom-actions\">\r\n      <button class=\"show-ans-btn\" data-show=\"P1ALL\">&#128065; Show All Answers (Part 1)<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"transcript-card collapsed\" id=\"ts1\">\r\n      <div class=\"ts-head\" data-toggle=\"ts1\"><span>&#128220; Part 1 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\r\n      <div class=\"ts-body\" id=\"tsBody1\"><p><b>Example:<\/b> &ldquo;I&rsquo;m looking for <b>Harry<\/b>. Where is he?&rdquo; &ldquo;He&rsquo;s standing near the tree.&rdquo; &ldquo;With snow on his head?&rdquo; &ldquo;Yes, some snow&rsquo;s just fallen on his head.&rdquo; &rarr; Harry = boy by the big tree with snow on his head.<\/p><p><b>1<\/b> &ldquo;Which girl is <b>Emma<\/b>?&rdquo; &ldquo;She&rsquo;s sitting on a sledge.&rdquo; &ldquo;With a dog?&rdquo; &ldquo;That&rsquo;s right.&rdquo; &rarr; girl sitting on the sledge with a dog.<\/p><p><b>2<\/b> &ldquo;Look at <b>David<\/b>. What&rsquo;s he doing?&rdquo; &ldquo;He&rsquo;s making the biggest snowman in the world!&rdquo; &rarr; boy making the big snowman.<\/p><p><b>3<\/b> &ldquo;Where&rsquo;s <b>Pat<\/b>?&rdquo; &ldquo;She&rsquo;s skiing down the hill.&rdquo; &ldquo;She&rsquo;s good, isn&rsquo;t she?&rdquo; &rarr; girl skiing down the hill.<\/p><p><b>4<\/b> &ldquo;<b>Peter<\/b>&rsquo;s very strong.&rdquo; &ldquo;Why, what&rsquo;s he doing?&rdquo; &ldquo;He&rsquo;s pulling that sledge.&rdquo; &rarr; boy pulling the sledge.<\/p><p><b>5<\/b> &ldquo;Look at <b>Helen<\/b>.&rdquo; &ldquo;Where is she?&rdquo; &ldquo;There &mdash; she&rsquo;s throwing snowballs at the snowman. One&rsquo;s just hit the snowman&rsquo;s head.&rdquo; &rarr; girl throwing snowballs at the small snowman.<\/p><p><i>(Betty is not used.)<\/i><\/p><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<!-- ============ PART 2 &#8212; Listen and write ============ -->\r\n<section class=\"part-section\" id=\"part2\">\r\n  <div class=\"wrap\">\r\n    <div class=\"part-head\">\r\n      <div class=\"part-num\">2<\/div>\r\n      <div class=\"part-head-text\">\r\n        <span class=\"qrange\">Questions 6&#8211;10 &#183; Listen and write<\/span>\r\n        <h2 class=\"serif\">Listen and write a name or a number<\/h2>\r\n        <p id=\"p2Intro\">A journalist asks Sue about her job. Listen and write the missing words or numbers. There is one example.<\/p>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"part-actions\">\r\n      <button class=\"act-pill\" data-time=\"300\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 2<\/button>\r\n      <button class=\"act-pill ts-toggle\" data-target=\"ts2\">&#128220; Transcript<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"form-card\" id=\"p2Form\">\r\n      <h4>&#128221; Listen and write<\/h4>\r\n      <div id=\"p2Examples\"><\/div>\r\n      <div id=\"p2Questions\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"notes-pad\">\r\n      <label>&#9999;&#65039; My notes for Part 2 (not graded)<\/label>\r\n      <textarea placeholder=\"Take notes while listening...\"><\/textarea>\r\n    <\/div>\r\n\r\n    <div class=\"transcript-card collapsed\" id=\"ts2\">\r\n      <div class=\"ts-head\" data-toggle=\"ts2\"><span>&#128220; Part 2 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\r\n      <div class=\"ts-body\" id=\"tsBody2\"><p>A journalist does a programme about jobs and talks to Sue.<\/p><p><b>Example:<\/b> &ldquo;What&rsquo;s your surname?&rdquo; &ldquo;<b>Clark<\/b> &mdash; C&ndash;L&ndash;A&ndash;R&ndash;K.&rdquo;<\/p><p><b>6<\/b> &ldquo;What do you do, Sue?&rdquo; &ldquo;I&rsquo;m an <b>artist<\/b>. I make things.&rdquo;<\/p><p><b>7<\/b> &ldquo;What do you make things with?&rdquo; &ldquo;Sometimes metal, but I prefer making things with <b>wood<\/b>.&rdquo;<\/p><p><b>8<\/b> &ldquo;Do you start work early?&rdquo; &ldquo;Yes. I work from <b>7 o&rsquo;clock<\/b> in the morning until midday.&rdquo;<\/p><p><b>9<\/b> &ldquo;Where do you like to work?&rdquo; &ldquo;I do all my work in the <b>basement<\/b>. It&rsquo;s nice and quiet there.&rdquo;<\/p><p><b>10<\/b> &ldquo;Did you make these things? They&rsquo;re lovely.&rdquo; &ldquo;Yes &mdash; and this is my favourite: a <b>music box<\/b>. If you turn the key, it plays a song!&rdquo;<\/p><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n\r\n<!-- ============ PART 3 &#8212; Multiple matching (Flyers) ============ -->\r\n<section class=\"part-section\" id=\"part3\">\r\n  <div class=\"wrap\">\r\n    <div class=\"part-head\">\r\n      <div class=\"part-num\">3<\/div>\r\n      <div class=\"part-head-text\">\r\n        <span class=\"qrange\">Questions 11&#8211;15 &#183; Multiple matching<\/span>\r\n        <h2 class=\"serif\">Match each person to a present<\/h2>\r\n        <p id=\"p3Intro\">Jim&rsquo;s mum went shopping and bought lots of presents for her friends. Look at the presents A&ndash;H. Listen and write a letter next to each person. There is one example.<\/p>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"part-actions\">\r\n      <button class=\"act-pill\" data-time=\"540\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 3<\/button>\r\n      <button class=\"act-pill ts-toggle\" data-target=\"ts3\">&#128220; Transcript<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"match-grid\" id=\"p3LetterBank\" style=\"display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px;margin:18px 0\"><\/div>\r\n\r\n    <div class=\"q-list\" id=\"part3List\"><\/div>\r\n\r\n    <div class=\"transcript-card collapsed\" id=\"ts3\">\r\n      <div class=\"ts-head\" data-toggle=\"ts3\"><span>&#128220; Part 3 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\r\n      <div class=\"ts-body\" id=\"tsBody3\"><p>Jim&rsquo;s mum bought presents for her friends at work. What did she buy for each person?<\/p><p><b>Example:<\/b> &ldquo;You know <b>Tony<\/b>? I got him a <b>belt<\/b>. It wasn&rsquo;t expensive but it&rsquo;s very nice.&rdquo; &rarr; <b>E<\/b> (belt).<\/p><p><b>11<\/b> &ldquo;It was difficult to choose for <b>Betty<\/b>. I found a nice <b>scarf<\/b> in the big shop next to the park. She can wear it at football matches.&rdquo; &rarr; <b>C<\/b> (scarf).<\/p><p><b>12<\/b> &ldquo;Then I went to the bookshop for <b>Richard<\/b>. I wanted a diary but found this <b>dictionary<\/b> &mdash; a good idea!&rdquo; &rarr; <b>F<\/b> (dictionary).<\/p><p><b>13<\/b> &ldquo;And <b>Sarah<\/b> &mdash; she loves skiing, so I found some great <b>gloves<\/b>, a lovely dark blue colour.&rdquo; &rarr; <b>G<\/b> (gloves).<\/p><p><b>14<\/b> &ldquo;In the music shop I wanted a CD of guitar music for <b>Robert<\/b>. I saw another <b>CD<\/b>, listened to it, it was great, so I bought that one.&rdquo; &rarr; <b>B<\/b> (CD).<\/p><p><b>15<\/b> &ldquo;I needed something for <b>Lucy<\/b>. I got a <b>torch<\/b>. It&rsquo;s not very exciting, but I couldn&rsquo;t find anything else.&rdquo; &rarr; <b>D<\/b> (torch).<\/p><p><i>(A = video, H = diary are not used.)<\/i><\/p><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n\r\n<!-- ============ PART 4 &#8212; Picture MCQ (Flyers) ============ -->\r\n<section class=\"part-section\" id=\"part4\">\r\n  <div class=\"wrap\">\r\n    <div class=\"part-head\">\r\n      <div class=\"part-num\">4<\/div>\r\n      <div class=\"part-head-text\">\r\n        <span class=\"qrange\">Questions 16&#8211;20 &#183; Listen and tick (&#10003;)<\/span>\r\n        <h2 class=\"serif\">Listen and tick (&#10003;) the box<\/h2>\r\n        <p id=\"p4Intro\">Jill talks about her weekend at her aunt&rsquo;s house. Look at the pictures, listen and tick (&#10003;) the box. There is one example.<\/p>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"part-actions\">\r\n      <button class=\"act-pill\" data-time=\"780\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 4<\/button>\r\n      <button class=\"act-pill ts-toggle\" data-target=\"ts4\">&#128220; Transcript<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"q-list\" id=\"part4List\"><\/div>\r\n\r\n    <div class=\"transcript-card collapsed\" id=\"ts4\">\r\n      <div class=\"ts-head\" data-toggle=\"ts4\"><span>&#128220; Part 4 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\r\n      <div class=\"ts-body\" id=\"tsBody4\"><p>Jill talks about her weekend at her aunt&rsquo;s house.<\/p><p><b>Example:<\/b> &ldquo;Did you enjoy your weekend?&rdquo; &ldquo;Yes! On Saturday I went riding in the mountains.&rdquo; &ldquo;On your bike?&rdquo; &ldquo;No. On a <b>horse<\/b>!&rdquo; &rarr; <b>B<\/b>.<\/p><p><b>16<\/b> &ldquo;Who did you go with?&rdquo; &ldquo;My cousin, <b>Ben<\/b>.&rdquo; &ldquo;He&rsquo;s got brown hair and glasses?&rdquo; &ldquo;He wears glasses but his hair&rsquo;s <b>blonde<\/b>.&rdquo; &rarr; <b>B<\/b>.<\/p><p><b>17<\/b> &ldquo;How did you go to your aunt&rsquo;s house? By car?&rdquo; &ldquo;No, my dad was working. So I went by <b>bus<\/b> &mdash; it&rsquo;s cheaper than the train.&rdquo; &rarr; <b>A<\/b>.<\/p><p><b>18<\/b> &ldquo;What&rsquo;s your aunt&rsquo;s house like?&rdquo; &ldquo;It&rsquo;s very big with <b>three floors<\/b>, and a garden with apple trees.&rdquo; &rarr; <b>C<\/b>.<\/p><p><b>19<\/b> &ldquo;Did you climb the trees?&rdquo; &ldquo;No, my aunt doesn&rsquo;t let us. But we&rsquo;ve got a <b>swing<\/b> on one of the trees. We played on that.&rdquo; &rarr; <b>C<\/b>.<\/p><p><b>20<\/b> &ldquo;Did you come home on Sunday afternoon?&rdquo; &ldquo;Yes. I left at half past one. It took about two hours, so I got home at <b>half past three<\/b>.&rdquo; &rarr; <b>C<\/b>.<\/p><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<!-- ============ PART 5 &#8212; Listen, colour and draw ============ -->\r\n<section class=\"part-section\" id=\"part5\">\r\n  <div class=\"wrap\">\r\n    <div class=\"part-head\">\r\n      <div class=\"part-num\">5<\/div>\r\n      <div class=\"part-head-text\">\r\n        <span class=\"qrange\">Questions 21&#8211;25 &#183; Listen, colour and draw<\/span>\r\n        <h2 class=\"serif\">Listen, colour and draw<\/h2>\r\n        <p id=\"p5Intro\">Listen and colour and draw on the park picture. Click a colour, then click an item to fill it. Use the form below for the two draw questions. There is one example.<\/p>\r\n      <\/div>\r\n    <\/div>\r\n    <div class=\"part-actions\">\r\n      <button class=\"act-pill\" data-time=\"1000\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"\/><\/svg> Replay Part 5<\/button>\r\n      <button class=\"act-pill ts-toggle\" data-target=\"ts5\">&#128220; Transcript<\/button>\r\n      <button class=\"act-pill\" id=\"p5Clear\">&#129529; Clear my colours<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"colour-wrap\">\r\n      <div class=\"colour-palette\" id=\"colourPalette\"><\/div>\r\n      <div class=\"colour-scene\" id=\"colourScene\">\r\n<div class=\"p5real\">\r\n<img decoding=\"async\" class=\"p5img\" src=\"\/wp-content\/uploads\/2026\/06\/f2t3-p5-scene.jpg\" alt=\"Part 5 colouring scene\" draggable=\"false\">\r\n<svg class=\"p5ovl\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\">\r\n<rect data-region=\"sweater_tall\" x=\"19.5\" y=\"46\" width=\"8.5\" height=\"8\" rx=\"1.5\" fill=\"none\"><\/rect>\r\n<rect data-region=\"swans\" x=\"73.5\" y=\"45.5\" width=\"21\" height=\"11\" rx=\"1.5\" fill=\"none\"><\/rect>\r\n<rect data-region=\"shorts_catch\" x=\"65.5\" y=\"82\" width=\"13\" height=\"7.5\" rx=\"1.5\" fill=\"none\"><\/rect>\r\n<\/svg>\r\n<\/div>\r\n      <\/div>\r\n      <div class=\"pair-hint\">&#128161; Click a colour, then click an item to fill. Use the form below for the two draw questions (Q21 &amp; Q25).<\/div>\r\n      <div class=\"colour-instructions\" id=\"colourInstructions\"><\/div>\r\n      <div class=\"pair-bottom-actions\">\r\n        <button class=\"show-ans-btn\" data-show=\"P5ALL\">&#128065; Show All Answers (Part 5)<\/button>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"form-card\" id=\"p5Form\">\r\n      <h4>&#128221; Draw questions (write what you drew)<\/h4>\r\n      <div id=\"p5Questions\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"notes-pad\">\r\n      <label>&#9999;&#65039; My notes for Part 5 (not graded)<\/label>\r\n      <textarea placeholder=\"Take notes while listening...\"><\/textarea>\r\n    <\/div>\r\n\r\n    <div class=\"transcript-card collapsed\" id=\"ts5\">\r\n      <div class=\"ts-head\" data-toggle=\"ts5\"><span>&#128220; Part 5 transcript<\/span><span class=\"chev\">&#9662;<\/span><\/div>\r\n      <div class=\"ts-body\" id=\"tsBody5\"><p>Colour and draw on the park picture.<\/p><p><b>Example:<\/b> &ldquo;Can you see the two trees? Colour the <b>leaves<\/b> on the trees <b>green<\/b>. All of them.&rdquo;<\/p><p><b>21<\/b> &ldquo;There are three butterflies. <b>Draw some red stripes<\/b> on the butterfly on the right.&rdquo;<\/p><p><b>22<\/b> &ldquo;Find the boy who&rsquo;s fishing. Look at the <b>tallest<\/b> boy. Colour his <b>sweater blue<\/b>.&rdquo;<\/p><p><b>23<\/b> &ldquo;Can you see the two swans? Colour them <b>black<\/b>.&rdquo; &ldquo;But swans are white!&rdquo; &ldquo;Not always.&rdquo;<\/p><p><b>24<\/b> &ldquo;Find the boy who&rsquo;s catching a ball. Colour his <b>shorts brown<\/b>.&rdquo;<\/p><p><b>25<\/b> &ldquo;<b>Draw a bridge<\/b> across the river, between the boys who are fishing and the swans.&rdquo;<\/p><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<!-- SUBMIT PANEL -->\r\n<div class=\"wrap\">\r\n  <div class=\"submit-panel\">\r\n    <h3>&#127919; Finished all 25 questions?<\/h3>\r\n    <p class=\"intro\">Submit to grade your whole test, OR use &#128065; Show Answer per part \/ per question.<\/p>\r\n    <div class=\"sp-buttons\">\r\n      <button class=\"btn-submit-big\" id=\"submitBtn\">\r\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.8\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"\/><\/svg>\r\n        Submit &amp; Grade All\r\n      <\/button>\r\n      <button class=\"btn-reset-big\" id=\"resetBtn\">&#128260; Reset Test<\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"results-banner\" id=\"resultsBanner\">\r\n    <h3>&#127911; Your Flyers Listening &mdash; Test 3 score<\/h3>\r\n    <div class=\"score-big\"><span id=\"finalScore\">0<\/span>\/25<\/div>\r\n    <p id=\"resultsMsg\">Great work!<\/p>\r\n    <div class=\"score-parts\" id=\"scoreParts\"><\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<footer class=\"footer\">\r\n  <div class=\"wrap\">\r\n    <p>&#169; 2026 All English 4U &#183; <a href=\"https:\/\/allenglish4u.com\/cambridge\/\">All Cambridge Tests<\/a> &#183; <a href=\"https:\/\/allenglish4u.com\/contact\/\">Contact<\/a><\/p>\r\n  <\/div>\r\n<\/footer>\r\n\r\n<script>eval(atob('CihmdW5jdGlvbigpewovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIEFFNFUgWUxFIEZMWUVSUyBMSVNURU5JTkcKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyogPT09PT0gREFUQSA9PT09PSAqLwovKiBQZXItdGVzdCBkYXRhIFx1MjAxNCBGbHllcnMgMiBUZXN0IDMgTGlzdGVuaW5nICovCnZhciBJTUcgPSAnL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA2Lyc7Ci8vIFBhcnQgMTogZHJhdyBsaW5lcyBcdTIwMTQgc25vdyBzY2VuZSAoRmx5ZXJzIDIgVGVzdCAzKQovLyBOYW1lcyBpbiBzY2VuZTogUGV0ZXIsIEVtbWEsIEJldHR5LCBIYXJyeSAodG9wKSAvIEhlbGVuLCBEYXZpZCwgUGF0IChib3R0b20pCi8vIEhhcnJ5ID0gZXhhbXBsZSAoYm95IGJ5IGJpZyB0cmVlLCBzbm93IG9uIGhlYWQpLiBCZXR0eSA9IGRpc3RyYWN0b3IgKG5vdCB1c2VkKS4KdmFyIFAxX05BTUVTID0gWwogIHtuOidFeCcsIG5hbWU6J0hhcnJ5JywgYW5zOid0YXJnZXRfaGFycnknLCBpc0V4YW1wbGU6dHJ1ZX0sCiAge246MSwgICAgbmFtZTonRW1tYScsICBhbnM6J3RhcmdldF9lbW1hJ30sCiAge246MiwgICAgbmFtZTonRGF2aWQnLCBhbnM6J3RhcmdldF9kYXZpZCd9LAogIHtuOjMsICAgIG5hbWU6J1BhdCcsICAgYW5zOid0YXJnZXRfcGF0J30sCiAge246NCwgICAgbmFtZTonUGV0ZXInLCBhbnM6J3RhcmdldF9wZXRlcid9LAogIHtuOjUsICAgIG5hbWU6J0hlbGVuJywgYW5zOid0YXJnZXRfaGVsZW4nfSwKICB7bjonXHUyMDEzJywgbmFtZTonQmV0dHknLCBhbnM6J3RhcmdldF9iZXR0eScsIGRpc3RyYWN0b3I6dHJ1ZX0KXTsKdmFyIFAxX1RBUkdFVFMgPSBbCiAge2tleTondGFyZ2V0X2hhcnJ5JywgbGFiZWw6J0hhcnJ5IFx1MjAxNCBib3kgYnkgdGhlIGJpZyB0cmVlLCBzbm93IG9uIGhpcyBoZWFkIChleGFtcGxlKScsIHg6ODUsIHk6NzksIGlzRXhhbXBsZTp0cnVlfSwKICB7a2V5Oid0YXJnZXRfZW1tYScsICBsYWJlbDonRW1tYSBcdTIwMTQgZ2lybCBzaXR0aW5nIG9uIHRoZSBzbGVkZ2Ugd2l0aCBhIGRvZycsICAgICAgICAgICB4OjYzLCB5OjM4fSwKICB7a2V5Oid0YXJnZXRfZGF2aWQnLCBsYWJlbDonRGF2aWQgXHUyMDE0IGJveSBtYWtpbmcgdGhlIGJpZyBzbm93bWFuJywgICAgICAgICAgICAgICAgICAgICB4OjM3LCB5OjgwfSwKICB7a2V5Oid0YXJnZXRfcGF0JywgICBsYWJlbDonUGF0IFx1MjAxNCBnaXJsIHNraWluZyBkb3duIHRoZSBoaWxsJywgICAgICAgICAgICAgICAgICAgICAgICB4OjY2LCB5OjEzfSwKICB7a2V5Oid0YXJnZXRfcGV0ZXInLCBsYWJlbDonUGV0ZXIgXHUyMDE0IGJveSBwdWxsaW5nIHRoZSBzbGVkZ2UnLCAgICAgICAgICAgICAgICAgICAgICAgICB4OjEyLCB5OjQ0fSwKICB7a2V5Oid0YXJnZXRfaGVsZW4nLCBsYWJlbDonSGVsZW4gXHUyMDE0IGdpcmwgdGhyb3dpbmcgc25vd2JhbGxzIGF0IHRoZSBzbWFsbCBzbm93bWFuJywgICB4OjI3LCB5OjIzfSwKICB7a2V5Oid0YXJnZXRfYmV0dHknLCBsYWJlbDonQmV0dHkgXHUyMDE0IGdpcmwgdGhyb3dpbmcgYSBzbm93YmFsbCAobm90IHVzZWQpJywgICAgICAgICAgICB4OjU4LCB5OjgwfQpdOwovLyBQYXJ0IDI6IFN1ZSB0aGUgYXJ0aXN0IGZvcm0KdmFyIFAyX0VYQU1QTEVTID0gWwogIHtsYWJlbDonU3VybmFtZTonLCBkaXNwbGF5OidDbGFyayd9Cl07CnZhciBQMl9RVUVTVElPTlMgPSBbCiAge246NiwgIGxhYmVsOidKb2I6JywgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkOlsnYXJ0aXN0JywnYW4gYXJ0aXN0J10sICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OidhcnRpc3QnfSwKICB7bjo3LCAgbGFiZWw6J01ha2VzIHRoaW5ncyB3aXRoOicsICAgICAgICAgcHJlZml4OidNZXRhbCBhbmQgJywgYWNjZXB0ZWQ6Wyd3b29kJ10sICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6J3dvb2QnfSwKICB7bjo4LCAgbGFiZWw6J1N0YXJ0cyB3b3JrIGF0OicsICAgICAgICAgICAgc3VmZml4OicgYS5tLicsIGFjY2VwdGVkOlsnNycsJ3NldmVuJywnNyBvY2xvY2snLCdzZXZlbiBvY2xvY2snLCc3IG9cdTIwMTljbG9jaycsJ3NldmVuIG9cdTIwMTljbG9jaycsIjcgbydjbG9jayIsInNldmVuIG8nY2xvY2siXSwgZGlzcGxheTonNyBvXHUyMDE5Y2xvY2sgLyBzZXZlbid9LAogIHtuOjksICBsYWJlbDonUGxhY2Ugb2Ygd29yazonLCAgICAgICAgICAgICBhY2NlcHRlZDpbJ2Jhc2VtZW50JywndGhlIGJhc2VtZW50JywnaW4gdGhlIGJhc2VtZW50J10sICAgZGlzcGxheTonKGluIHRoZSkgYmFzZW1lbnQnfSwKICB7bjoxMCwgbGFiZWw6J0Zhdm91cml0ZSB0aGluZzonLCAgICAgICAgICAgYWNjZXB0ZWQ6WydtdXNpYyBib3gnLCdhIG11c2ljIGJveCcsJ211c2ljYm94J10sICAgICAgICAgIGRpc3BsYXk6JyhhKSBtdXNpYyBib3gnfQpdOwovLyBQYXJ0IDM6IG1hdGNoIHBlb3BsZSB0byBwcmVzZW50cyBBLUggKEppbSdzIG11bSdzIHNob3BwaW5nKQp2YXIgUDNfTEVUVEVSX0JBTksgPSBbCiAge0w6J0EnLCBsYWJlbDondmlkZW8nfSwKICB7TDonQicsIGxhYmVsOidDRCd9LAogIHtMOidDJywgbGFiZWw6J3NjYXJmJ30sCiAge0w6J0QnLCBsYWJlbDondG9yY2gnfSwKICB7TDonRScsIGxhYmVsOidiZWx0J30sCiAge0w6J0YnLCBsYWJlbDonZGljdGlvbmFyeSd9LAogIHtMOidHJywgbGFiZWw6J2dsb3Zlcyd9LAogIHtMOidIJywgbGFiZWw6J2RpYXJ5J30KXTsKdmFyIFAzX0VYQU1QTEVfTUFUQ0ggPSB7bjonRXgnLCBwZXJzb246J1RvbnknLCAgIGFuczonRScsIHdoeTonYmVsdCd9Owp2YXIgUDNfUVVFU1RJT05TX01BVENIID0gWwogIHtuOjExLCBwZXJzb246J0JldHR5JywgICBhbnM6J0MnLCB3aHk6J3NjYXJmJ30sCiAge246MTIsIHBlcnNvbjonUmljaGFyZCcsIGFuczonRicsIHdoeTonZGljdGlvbmFyeSd9LAogIHtuOjEzLCBwZXJzb246J1NhcmFoJywgICBhbnM6J0cnLCB3aHk6J2dsb3Zlcyd9LAogIHtuOjE0LCBwZXJzb246J1JvYmVydCcsICBhbnM6J0InLCB3aHk6J0NEJ30sCiAge246MTUsIHBlcnNvbjonTHVjeScsICAgIGFuczonRCcsIHdoeTondG9yY2gnfQpdOwovLyBTdGFydGVycy1zdHlsZSBQMyBNQ1EgZGlzYWJsZWQgZm9yIEZseWVycyAoUDMgPSBBLUggbWF0Y2hpbmcgYWJvdmUpCnZhciBQM19FWEFNUExFID0gbnVsbDsKdmFyIFAzX1FVRVNUSU9OUyA9IFtdOwovLyBQYXJ0IDU6IGNvbG91ciBwYWxldHRlICsgcGFyayBTVkcgc2NlbmUgKGRlY2xhcmVkIGJlZm9yZSBQNCBhbGlhcykKdmFyIFA0X0VYQU1QTEUgPSB7aW5zdHJ1Y3Rpb246J0V4YW1wbGUgXHUyMDE0IGNvbG91ciB0aGUgbGVhdmVzIG9uIHRoZSB0cmVlcyBncmVlbi4nLCByZWdpb246J2xlYXZlcycsIGNvbG91cjonZ3JlZW4nfTsKdmFyIFA1X0VYQU1QTEVTID0gW107CnZhciBQNV9JVEVNU19DT0xPVVIgPSBbCiAge246MjIsIGluc3RydWN0aW9uOidDb2xvdXIgdGhlIHN3ZWF0ZXIgb2YgdGhlIHRhbGxlc3QgYm95IGZpc2hpbmcgQkxVRS4nLCByZWdpb246J3N3ZWF0ZXJfdGFsbCcsIGNvbG91cjonYmx1ZSd9LAogIHtuOjIzLCBpbnN0cnVjdGlvbjonQ29sb3VyIGJvdGggc3dhbnMgQkxBQ0suJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uOidzd2FucycsICAgICAgICBjb2xvdXI6J2JsYWNrJ30sCiAge246MjQsIGluc3RydWN0aW9uOidDb2xvdXIgdGhlIHNob3J0cyBvZiB0aGUgYm95IGNhdGNoaW5nIHRoZSBiYWxsIEJST1dOLicsIHJlZ2lvbjonc2hvcnRzX2NhdGNoJywgY29sb3VyOidicm93bid9Cl07CnZhciBQNV9RVUVTVElPTlMgPSBbCiAge246MjEsIGxhYmVsOidEcmF3IHNvbWUgcmVkIHN0cmlwZXMgb24gdGhlIGJ1dHRlcmZseSBvbiB0aGUgcmlnaHQuJywgYWNjZXB0ZWQ6WydyZWQgc3RyaXBlcycsJ3N0cmlwZXMnLCdkcmF3IHJlZCBzdHJpcGVzJywnZHJldyByZWQgc3RyaXBlcycsJ2RyYXcgc3RyaXBlcycsJ2RyZXcgc3RyaXBlcycsJ3JlZCBsaW5lcyddLCBkaXNwbGF5OidyZWQgc3RyaXBlcyAob24gdGhlIHJpZ2h0IGJ1dHRlcmZseSknfSwKICB7bjoyNSwgbGFiZWw6J0RyYXcgYSBicmlkZ2UgYWNyb3NzIHRoZSByaXZlciAoYmV0d2VlbiB0aGUgZmlzaGluZyBib3lzIGFuZCB0aGUgc3dhbnMpLicsIGFjY2VwdGVkOlsnYnJpZGdlJywnYSBicmlkZ2UnLCdkcmF3IGEgYnJpZGdlJywnZHJldyBhIGJyaWRnZScsJ2RyZXcgYnJpZGdlJywnZHJhdyBicmlkZ2UnXSwgZGlzcGxheTonYSBicmlkZ2UgYWNyb3NzIHRoZSByaXZlcid9Cl07CnZhciBQNF9JVEVNUyA9IFA1X0lURU1TX0NPTE9VUjsKLy8gRmx5ZXJzIFBhcnQgNDogcGljdHVyZSBNQ1EgNSBxdWVzdGlvbnMgeCAzIG9wdGlvbnMgKEppbGwncyB3ZWVrZW5kKQp2YXIgUDRfRVhBTVBMRV9QSUMgPSB7CiAgcToiV2hhdCBkaWQgSmlsbCBkbyBhdCB0aGUgd2Vla2VuZD8iLAogIG9wdHM6WwogICAge2xldHRlcjonQScsIGltZzpJTUcrJ2YydDMtcDQtZXgtYS5qcGcnfSwKICAgIHtsZXR0ZXI6J0InLCBpbWc6SU1HKydmMnQzLXA0LWV4LWIuanBnJywgaXNBbnN3ZXI6dHJ1ZX0sCiAgICB7bGV0dGVyOidDJywgaW1nOklNRysnZjJ0My1wNC1leC1jLmpwZyd9CiAgXSwKICBhbnM6J0InCn07CnZhciBQNF9RVUVTVElPTlNfUElDID0gWwogIHtuOjE2LCBxOidXaGljaCBwZXJzb24gaXMgSmlsbFx1MjAxOXMgY291c2luPycsCiAgIG9wdHM6W3tsZXR0ZXI6J0EnLGltZzpJTUcrJ2YydDMtcDQtcTE2LWEuanBnJ30se2xldHRlcjonQicsaW1nOklNRysnZjJ0My1wNC1xMTYtYi5qcGcnLGlzQW5zd2VyOnRydWV9LHtsZXR0ZXI6J0MnLGltZzpJTUcrJ2YydDMtcDQtcTE2LWMuanBnJ31dLAogICBhbnM6J0InfSwKICB7bjoxNywgcTonSG93IGRpZCBKaWxsIGdvIHRvIGhlciBhdW50XHUyMDE5cyBob3VzZT8nLAogICBvcHRzOlt7bGV0dGVyOidBJyxpbWc6SU1HKydmMnQzLXA0LXExNy1hLmpwZycsaXNBbnN3ZXI6dHJ1ZX0se2xldHRlcjonQicsaW1nOklNRysnZjJ0My1wNC1xMTctYi5qcGcnfSx7bGV0dGVyOidDJyxpbWc6SU1HKydmMnQzLXA0LXExNy1jLmpwZyd9XSwKICAgYW5zOidBJ30sCiAge246MTgsIHE6J1doaWNoIGhvdXNlIGlzIEppbGxcdTIwMTlzIGF1bnRcdTIwMTlzPycsCiAgIG9wdHM6W3tsZXR0ZXI6J0EnLGltZzpJTUcrJ2YydDMtcDQtcTE4LWEuanBnJ30se2xldHRlcjonQicsaW1nOklNRysnZjJ0My1wNC1xMTgtYi5qcGcnfSx7bGV0dGVyOidDJyxpbWc6SU1HKydmMnQzLXA0LXExOC1jLmpwZycsaXNBbnN3ZXI6dHJ1ZX1dLAogICBhbnM6J0MnfSwKICB7bjoxOSwgcTonV2hhdCBkaWQgSmlsbCBhbmQgaGVyIGNvdXNpbiBkbz8nLAogICBvcHRzOlt7bGV0dGVyOidBJyxpbWc6SU1HKydmMnQzLXA0LXExOS1hLmpwZyd9LHtsZXR0ZXI6J0InLGltZzpJTUcrJ2YydDMtcDQtcTE5LWIuanBnJ30se2xldHRlcjonQycsaW1nOklNRysnZjJ0My1wNC1xMTktYy5qcGcnLGlzQW5zd2VyOnRydWV9XSwKICAgYW5zOidDJ30sCiAge246MjAsIHE6J1doYXQgdGltZSBkaWQgSmlsbCBhcnJpdmUgaG9tZSBvbiBTdW5kYXk\/JywKICAgb3B0czpbe2xldHRlcjonQScsaW1nOklNRysnZjJ0My1wNC1xMjAtYS5qcGcnfSx7bGV0dGVyOidCJyxpbWc6SU1HKydmMnQzLXA0LXEyMC1iLmpwZyd9LHtsZXR0ZXI6J0MnLGltZzpJTUcrJ2YydDMtcDQtcTIwLWMuanBnJyxpc0Fuc3dlcjp0cnVlfV0sCiAgIGFuczonQyd9Cl07CnZhciBQNF9DT0xPVVJTID0gWwogIHtrZXk6J3JlZCcsICAgIGhleDonI0VGNDQ0NCd9LAogIHtrZXk6J2JsdWUnLCAgIGhleDonIzNCODJGNid9LAogIHtrZXk6J2dyZWVuJywgIGhleDonIzEwQjk4MSd9LAogIHtrZXk6J3llbGxvdycsIGhleDonI0ZBQ0MxNSd9LAogIHtrZXk6J29yYW5nZScsIGhleDonI0Y5NzMxNid9LAogIHtrZXk6J3B1cnBsZScsIGhleDonIzhCNUNGNid9LAogIHtrZXk6J3BpbmsnLCAgIGhleDonI0VDNDg5OSd9LAogIHtrZXk6J2dyZXknLCAgIGhleDonIzlDQTNBRid9LAogIHtrZXk6J2Jyb3duJywgIGhleDonIzkyNDAwRSd9LAogIHtrZXk6J2JsYWNrJywgIGhleDonIzBGMTcyQSd9Cl07CnZhciBUT1RBTD0yNTsKCi8qID09PT09IFVUSUxJVElFUyA9PT09PSAqLwpmdW5jdGlvbiBlc2Mocyl7cmV0dXJuIFN0cmluZyhzKS5yZXBsYWNlKC9bJjw+IiddL2csZnVuY3Rpb24oYyl7cmV0dXJueycmJzonJmFtcDsnLCc8JzonJmx0OycsJz4nOicmZ3Q7JywnIic6JyZxdW90OycsIiciOicmIzM5Oyd9W2NdfSl9CmZ1bmN0aW9uICQkKHNlbCxjdHgpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCgoY3R4fHxkb2N1bWVudCkucXVlcnlTZWxlY3RvckFsbChzZWwpKX0KZnVuY3Rpb24gJChzZWwsY3R4KXtyZXR1cm4gKGN0eHx8ZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3Ioc2VsKX0KCi8qID09PT09IEhFQURFUiArIERSQVdFUiA9PT09PSAqLwp2YXIgaGRyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZHInKTsKZnVuY3Rpb24gc2V0U29saWQoKXtpZih3aW5kb3cuc2Nyb2xsWT40MCloZHIuY2xhc3NMaXN0LmFkZCgnc29saWQnKTtlbHNlIGhkci5jbGFzc0xpc3QucmVtb3ZlKCdzb2xpZCcpfQp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyxzZXRTb2xpZCx7cGFzc2l2ZTp0cnVlfSk7c2V0U29saWQoKTsKdmFyIGhhbWI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhbWInKSxkcmF3ZXI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyYXdlcicpLGRDbG9zZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJhd2VyQ2xvc2UnKTsKaWYoaGFtYiloYW1iLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe2RyYXdlci5jbGFzc0xpc3QuYWRkKCdvcGVuJyl9KTsKaWYoZENsb3NlKWRDbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXtkcmF3ZXIuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpfSk7CmlmKGRyYXdlcilkcmF3ZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0PT09ZHJhd2VyKWRyYXdlci5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyl9KTsKCi8qID09PT09IFlPVVRVQkUgPT09PT0gKi8KdmFyIHl0UmVhZHk9ZmFsc2UsIHl0UGxheWVyPW51bGw7CnZhciB0YWc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7IHRhZy5zcmM9J2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2lmcmFtZV9hcGknOwpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRhZyk7CndpbmRvdy5vbllvdVR1YmVJZnJhbWVBUElSZWFkeT1mdW5jdGlvbigpewogIHl0UGxheWVyPW5ldyBZVC5QbGF5ZXIoJ3l0UGxheWVyJyx7ZXZlbnRzOntvblJlYWR5OmZ1bmN0aW9uKCl7eXRSZWFkeT10cnVlfX19KTsKfTsKZnVuY3Rpb24geXRTZWVrKHNlYyl7CiAgaWYoeXRSZWFkeSl7IHl0UGxheWVyLnNlZWtUbyhzZWMsIHRydWUpOyB5dFBsYXllci5wbGF5VmlkZW8oKTsgfQogIGVsc2V7IHZhciBmPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd5dFBsYXllcicpOyBmLnNyYz1mLnNyYy5zcGxpdCgnPycpWzBdKyc\/ZW5hYmxlanNhcGk9MSZyZWw9MCZhdXRvcGxheT0xJnN0YXJ0PScrc2VjOyB9Cn0KZnVuY3Rpb24geXRQYXVzZSgpeyBpZih5dFJlYWR5KXl0UGxheWVyLnBhdXNlVmlkZW8oKTsgfQpmdW5jdGlvbiB5dFBsYXkoKXsgaWYoeXRSZWFkeSl5dFBsYXllci5wbGF5VmlkZW8oKTsgfQpmdW5jdGlvbiB5dFJld2luZCgpeyBpZih5dFJlYWR5KXsgdmFyIHQ9eXRQbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKTsgeXRQbGF5ZXIuc2Vla1RvKE1hdGgubWF4KDAsdC0xMCksdHJ1ZSk7IH0gfQpmdW5jdGlvbiB5dFJhdGUocil7IGlmKHl0UmVhZHkpeXRQbGF5ZXIuc2V0UGxheWJhY2tSYXRlKHIpOyB9CgokJCgnLmp1bXAtYnRuJykuZm9yRWFjaChmdW5jdGlvbihiKXsKICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgdmFyIHQ9cGFyc2VJbnQoYi5kYXRhc2V0LnRpbWUpOwogICAgeXRTZWVrKHQpOwogICAgJCQoJy5qdW1wLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oeCl7eC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKX0pOwogICAgYi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIGlmKGIuZGF0YXNldC5wYXJ0ICYmIGIuZGF0YXNldC5wYXJ0IT09J2ludHJvJyl7CiAgICAgIHZhciBzZWM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhcnQnK2IuZGF0YXNldC5wYXJ0KTsKICAgICAgaWYoc2VjKXNlYy5zY3JvbGxJbnRvVmlldyh7YmVoYXZpb3I6J3Ntb290aCcsYmxvY2s6J3N0YXJ0J30pOwogICAgfQogIH0pOwp9KTsKJCQoJy5hY3QtcGlsbFtkYXRhLXRpbWVdJykuZm9yRWFjaChmdW5jdGlvbihiKXsKICBiLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpeyB5dFNlZWsocGFyc2VJbnQoYi5kYXRhc2V0LnRpbWUpKTsgfSk7Cn0pOwpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuUGF1c2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycseXRQYXVzZSk7CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5QbGF5JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHl0UGxheSk7CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5SZXdpbmQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycseXRSZXdpbmQpOwpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuU2xvd2VyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7eXRSYXRlKDAuNzUpfSk7CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5Ob3JtYWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXt5dFJhdGUoMSl9KTsKCiQkKCcudHMtdG9nZ2xlLCAudHMtaGVhZCcpLmZvckVhY2goZnVuY3Rpb24oYil7CiAgYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgIHZhciB0YXJnZXQ9Yi5kYXRhc2V0LnRhcmdldHx8Yi5kYXRhc2V0LnRvZ2dsZTsKICAgIGlmKCF0YXJnZXQpeyB2YXIgY2FyZD1iLmNsb3Nlc3QoJy50cmFuc2NyaXB0LWNhcmQnKTsgaWYoY2FyZCl0YXJnZXQ9Y2FyZC5pZDsgfQogICAgdmFyIGNhcmQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0KTsKICAgIGlmKGNhcmQpY2FyZC5jbGFzc0xpc3QudG9nZ2xlKCdjb2xsYXBzZWQnKTsKICB9KTsKfSk7CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogUEFSVCAxIFx1MjAxNCBEUkFXIExJTkVTCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwp2YXIgUDFfdXNlck1hdGNoZXMgPSB7fTsgLy8geyBuYW1lTjogdGd0S2V5IH0KdmFyIFAxX3NlbGVjdGVkTmFtZSA9IG51bGw7CnZhciBwYWlyTmFtZXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWlyTmFtZXMnKTsKdmFyIHBhaXJUYXJnZXRzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFpclRhcmdldHMnKTsKdmFyIHBhaXJMaW5lc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhaXJMaW5lcycpOwp2YXIgcGFpckltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWlySW1nJyk7CnZhciBwYWlyU2NlbmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFpclNjZW5lJyk7CgpmdW5jdGlvbiByZW5kZXJQMU5hbWVzKCl7CiAgcGFpck5hbWVzRWwuaW5uZXJIVE1MID0gJyc7CiAgUDFfTkFNRVMuZm9yRWFjaChmdW5jdGlvbihuYW1lKXsKICAgIHZhciBkaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBkaXYuY2xhc3NOYW1lPSdwYWlyLW5hbWUnICsgKG5hbWUuaXNFeGFtcGxlPycgZXhhbXBsZSc6JycpOwogICAgZGl2LmRhdGFzZXQubiA9IG5hbWUubjsKICAgIGRpdi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9InBuLW51bSI+Jytlc2MoU3RyaW5nKG5hbWUubikpKyc8L3NwYW4+PHNwYW4+Jytlc2MobmFtZS5uYW1lKSsnPC9zcGFuPjxzcGFuIGNsYXNzPSJwbi1kb3QiPjwvc3Bhbj4nOwogICAgaWYoIW5hbWUuaXNFeGFtcGxlKXsKICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICAgICQkKCcucGFpci1uYW1lJyxwYWlyTmFtZXNFbCkuZm9yRWFjaChmdW5jdGlvbih4KXt4LmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyl9KTsKICAgICAgICBpZihQMV9zZWxlY3RlZE5hbWU9PT1uYW1lLm4peyBQMV9zZWxlY3RlZE5hbWU9bnVsbDsgfQogICAgICAgIGVsc2UgeyBkaXYuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTsgUDFfc2VsZWN0ZWROYW1lPW5hbWUubjsgfQogICAgICB9KTsKICAgIH0KICAgIHBhaXJOYW1lc0VsLmFwcGVuZENoaWxkKGRpdik7CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlbmRlclAxVGFyZ2V0cygpewogIHBhaXJUYXJnZXRzRWwuaW5uZXJIVE1MPScnOwogIFAxX1RBUkdFVFMuZm9yRWFjaChmdW5jdGlvbih0KXsKICAgIHZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgZC5jbGFzc05hbWU9J3RndCcrKHQuaXNFeGFtcGxlPycgZXhhbXBsZSc6JycpOwogICAgZC5zdHlsZS5sZWZ0PXQueCsnJSc7CiAgICBkLnN0eWxlLnRvcD10LnkrJyUnOwogICAgZC5kYXRhc2V0LmtleT10LmtleTsKICAgIGQuaW5uZXJIVE1MPSc8c3BhbiBjbGFzcz0idGxhYmVsIj4nK2VzYyh0LmxhYmVsKSsnPC9zcGFuPic7CiAgICBpZighdC5pc0V4YW1wbGUpewogICAgICBkLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICAgIGlmKCFQMV9zZWxlY3RlZE5hbWUpcmV0dXJuOwogICAgICAgIC8vIHJlbW92ZSBleGlzdGluZyBtYXRjaCBmb3IgdGhpcyBuYW1lCiAgICAgICAgZGVsZXRlIFAxX3VzZXJNYXRjaGVzW1AxX3NlbGVjdGVkTmFtZV07CiAgICAgICAgLy8gcmVtb3ZlIGFueSBuYW1lIHRoYXQgbWFwcyB0byB0aGlzIHRhcmdldAogICAgICAgIE9iamVjdC5rZXlzKFAxX3VzZXJNYXRjaGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGspewogICAgICAgICAgaWYoUDFfdXNlck1hdGNoZXNba109PT10LmtleSkgZGVsZXRlIFAxX3VzZXJNYXRjaGVzW2tdOwogICAgICAgIH0pOwogICAgICAgIFAxX3VzZXJNYXRjaGVzW1AxX3NlbGVjdGVkTmFtZV0gPSB0LmtleTsKICAgICAgICB2YXIgbmFtZUVsID0gcGFpck5hbWVzRWwucXVlcnlTZWxlY3RvcignW2RhdGEtbj0iJytQMV9zZWxlY3RlZE5hbWUrJyJdJyk7CiAgICAgICAgaWYobmFtZUVsKXtuYW1lRWwuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTtuYW1lRWwuY2xhc3NMaXN0LmFkZCgnbWF0Y2hlZCcpO30KICAgICAgICBQMV9zZWxlY3RlZE5hbWU9bnVsbDsKICAgICAgICBkcmF3UDFMaW5lcygpOwogICAgICAgIHVwZGF0ZVByb2dyZXNzKCk7CiAgICAgIH0pOwogICAgfQogICAgcGFpclRhcmdldHNFbC5hcHBlbmRDaGlsZChkKTsKICB9KTsKfQoKZnVuY3Rpb24gZHJhd1AxTGluZXMob3B0cyl7CiAgb3B0cyA9IG9wdHMgfHwge307CiAgdmFyIHNob3dDb3JyZWN0ID0gb3B0cy5zaG93Q29ycmVjdDsKICB2YXIgYmJveCA9IHBhaXJJbWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgdmFyIHNjZW5lQmJveCA9IHBhaXJTY2VuZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBwYWlyTGluZXNFbC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgc2NlbmVCYm94LndpZHRoKTsKICBwYWlyTGluZXNFbC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHNjZW5lQmJveC5oZWlnaHQpOwogIHBhaXJMaW5lc0VsLnNldEF0dHJpYnV0ZSgndmlld0JveCcsICcwIDAgJytzY2VuZUJib3gud2lkdGgrJyAnK3NjZW5lQmJveC5oZWlnaHQpOwogIHZhciBzdmducz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOwogIHBhaXJMaW5lc0VsLmlubmVySFRNTD0nJzsKCiAgLy8gZXhhbXBsZSBsaW5lIChhbHdheXMgc2hvdykKICB2YXIgZXhOYW1lID0gUDFfTkFNRVMuZmluZChmdW5jdGlvbihuKXtyZXR1cm4gbi5pc0V4YW1wbGV9KTsKICB2YXIgZXhUZ3QgPSBQMV9UQVJHRVRTLmZpbmQoZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNFeGFtcGxlfSk7CiAgaWYoZXhOYW1lICYmIGV4VGd0KXsKICAgIGRyYXdMaW5lKGV4TmFtZS5uLCBleFRndCwgJyNGQkJGMjQnLCAzLCB0cnVlKTsKICB9CgogIC8vIHVzZXIgbGluZXMgKG9yIGNvcnJlY3QgbGluZXMgaWYgc2hvd0NvcnJlY3QpCiAgUDFfTkFNRVMuZm9yRWFjaChmdW5jdGlvbihuYW1lKXsKICAgIGlmKG5hbWUuaXNFeGFtcGxlKXJldHVybjsKICAgIHZhciB0Z3RLZXk7CiAgICBpZihzaG93Q29ycmVjdCkgdGd0S2V5ID0gbmFtZS5hbnM7CiAgICBlbHNlIHRndEtleSA9IFAxX3VzZXJNYXRjaGVzW25hbWUubl07CiAgICBpZighdGd0S2V5KXJldHVybjsKICAgIHZhciB0Z3QgPSBQMV9UQVJHRVRTLmZpbmQoZnVuY3Rpb24odCl7cmV0dXJuIHQua2V5PT09dGd0S2V5fSk7CiAgICBpZighdGd0KXJldHVybjsKICAgIHZhciBjb2xvdXIgPSBzaG93Q29ycmVjdCA\/ICcjMTBCOTgxJyA6ICcjMDZCNkQ0JzsKICAgIGRyYXdMaW5lKG5hbWUubiwgdGd0LCBjb2xvdXIsIDIuNSwgZmFsc2UpOwogIH0pOwoKICBmdW5jdGlvbiBkcmF3TGluZShuYW1lTiwgdGd0LCBjb2xvdXIsIHcsIGlzRXhhbXBsZSl7CiAgICB2YXIgbmFtZUVsID0gcGFpck5hbWVzRWwucXVlcnlTZWxlY3RvcignW2RhdGEtbj0iJytuYW1lTisnIl0nKTsKICAgIGlmKCFuYW1lRWwpcmV0dXJuOwogICAgdmFyIG5iID0gbmFtZUVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgdmFyIHgxID0gbmIucmlnaHQgLSBzY2VuZUJib3gubGVmdDsKICAgIHZhciB5MSA9IG5iLnRvcCArIG5iLmhlaWdodC8yIC0gc2NlbmVCYm94LnRvcDsKICAgIHZhciB4MiA9IHRndC54LzEwMCAqIHNjZW5lQmJveC53aWR0aDsKICAgIHZhciB5MiA9IHRndC55LzEwMCAqIHNjZW5lQmJveC5oZWlnaHQ7CiAgICB2YXIgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzdmducywnbGluZScpOwogICAgbGluZS5zZXRBdHRyaWJ1dGUoJ3gxJyx4MSk7CiAgICBsaW5lLnNldEF0dHJpYnV0ZSgneTEnLHkxKTsKICAgIGxpbmUuc2V0QXR0cmlidXRlKCd4MicseDIpOwogICAgbGluZS5zZXRBdHRyaWJ1dGUoJ3kyJyx5Mik7CiAgICBsaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJyxjb2xvdXIpOwogICAgbGluZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsdyk7CiAgICBsaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWxpbmVjYXAnLCdyb3VuZCcpOwogICAgaWYoaXNFeGFtcGxlKSBsaW5lLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWRhc2hhcnJheScsJzYgNCcpOwogICAgbGluZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gaXNFeGFtcGxlID8gJ25vbmUnIDogJ3N0cm9rZSc7CiAgICBsaW5lLnN0eWxlLmN1cnNvciA9IGlzRXhhbXBsZSA\/ICdkZWZhdWx0JyA6ICdwb2ludGVyJzsKICAgIGlmKCFpc0V4YW1wbGUpewogICAgICBsaW5lLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICAgIC8vIGVyYXNlIHRoaXMgbGluZQogICAgICAgIGRlbGV0ZSBQMV91c2VyTWF0Y2hlc1tuYW1lTl07CiAgICAgICAgdmFyIG5hbWVFbDIgPSBwYWlyTmFtZXNFbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1uPSInK25hbWVOKyciXScpOwogICAgICAgIGlmKG5hbWVFbDIpIG5hbWVFbDIuY2xhc3NMaXN0LnJlbW92ZSgnbWF0Y2hlZCcpOwogICAgICAgIGRyYXdQMUxpbmVzKCk7CiAgICAgICAgdXBkYXRlUHJvZ3Jlc3MoKTsKICAgICAgfSk7CiAgICB9CiAgICBwYWlyTGluZXNFbC5hcHBlbmRDaGlsZChsaW5lKTsKICB9Cn0KCmZ1bmN0aW9uIHAxUmV2ZWFsKCl7CiAgLy8gc2hvdyBjb3JyZWN0IGxpbmVzLCBsb2NrIGludGVyYWN0aW9ucwogIGRyYXdQMUxpbmVzKHtzaG93Q29ycmVjdDp0cnVlfSk7CiAgJCQoJy5wYWlyLW5hbWUnLHBhaXJOYW1lc0VsKS5mb3JFYWNoKGZ1bmN0aW9uKGVsKXsKICAgIGVsLnN0eWxlLm9wYWNpdHk9Jy43JzsKICAgIGVsLnN0eWxlLnBvaW50ZXJFdmVudHM9J25vbmUnOwogIH0pOwogICQkKCcudGd0JyxwYWlyVGFyZ2V0c0VsKS5mb3JFYWNoKGZ1bmN0aW9uKGVsKXsKICAgIGlmKCFlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2V4YW1wbGUnKSllbC5zdHlsZS5wb2ludGVyRXZlbnRzPSdub25lJzsKICB9KTsKfQoKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3AxQ2xlYXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICBpZighY29uZmlybSgnQ2xlYXIgYWxsIHlvdXIgUGFydCAxIGxpbmVzPycpKXJldHVybjsKICBQMV91c2VyTWF0Y2hlcz17fTsKICAkJCgnLnBhaXItbmFtZScscGFpck5hbWVzRWwpLmZvckVhY2goZnVuY3Rpb24oeCl7eC5jbGFzc0xpc3QucmVtb3ZlKCdtYXRjaGVkJywnc2VsZWN0ZWQnKX0pOwogIGRyYXdQMUxpbmVzKCk7CiAgdXBkYXRlUHJvZ3Jlc3MoKTsKfSk7Cgp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyxmdW5jdGlvbigpe2RyYXdQMUxpbmVzKCl9KTsKCnJlbmRlclAxTmFtZXMoKTsKcmVuZGVyUDFUYXJnZXRzKCk7CnBhaXJJbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsZHJhd1AxTGluZXMpOwovLyBhbHNvIGRyYXcgYWZ0ZXIgYSB0aWNrIChpbiBjYXNlIGNhY2hlZCkKc2V0VGltZW91dChkcmF3UDFMaW5lcywgMjAwKTsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBQQVJUIDIgXHUyMDE0IElOUFVUIEJMQU5LUwogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKGZ1bmN0aW9uKCl7CiAgdmFyIGV4YW1wbGVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncDJFeGFtcGxlcycpOwogIFAyX0VYQU1QTEVTLmZvckVhY2goZnVuY3Rpb24oZXgpewogICAgZXhhbXBsZXNFbC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsCiAgICAgICc8ZGl2IGNsYXNzPSJmb3JtLXJvdyBleGFtcGxlIj48bGFiZWw+Jytlc2MoZXgubGFiZWwpKycgPHNwYW4gY2xhc3M9ImV4LXRhZyI+RXg8L3NwYW4+PC9sYWJlbD48c3BhbiBzdHlsZT0iY29sb3I6IzdCNUIwMDtmb250LXdlaWdodDo3MDAiPicrZXNjKGV4LmRpc3BsYXkpKyc8L3NwYW4+PC9kaXY+JwogICAgKTsKICB9KTsKICB2YXIgcXVlc3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwMlF1ZXN0aW9ucycpOwogIFAyX1FVRVNUSU9OUy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgdmFyIHByZWZpeEh0bWwgPSBxLnByZWZpeCA\/IGVzYyhxLnByZWZpeCkrJyAnIDogJyc7CiAgICB2YXIgc3VmZml4SHRtbCA9IHEuc3VmZml4ID8gJyAnK2VzYyhxLnN1ZmZpeCkgOiAnJzsKICAgIHF1ZXN0RWwuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLAogICAgICAnPGRpdiBjbGFzcz0iZm9ybS1yb3ciPjxsYWJlbD48Yj4nK3EubisnLjwvYj4gJytlc2MocS5sYWJlbCkrJzwvbGFiZWw+JysKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NHB4Ij4nK3ByZWZpeEh0bWwrCiAgICAgICc8aW5wdXQgY2xhc3M9ImlucHV0LWJsYW5rIiBkYXRhLXE9IicrcS5uKyciIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSIuLi4iPicrc3VmZml4SHRtbCsnPC9zcGFuPicrCiAgICAgICc8YnV0dG9uIGNsYXNzPSJzaG93LWFucy1idG4iIGRhdGEtc2hvdz0iJytxLm4rJyI+XHV7MUY0NDF9IFNob3c8L2J1dHRvbj48L2Rpdj4nCiAgICApOwogIH0pOwp9KSgpOwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFBBUlQgMyBcdTIwMTQgUElDVFVSRSBNQ1EgKHVudXNlZCBmb3IgRmx5ZXJzKQogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKGZ1bmN0aW9uKCl7CiAgdmFyIGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFydDNMaXN0Jyk7CiAgLy8gZXhhbXBsZQogIGlmKFAzX0VYQU1QTEUpewogICAgdmFyIGV4SHRtbCA9ICc8ZGl2IGNsYXNzPSJxLWl0ZW0gcmV2ZWFsZWQiIHN0eWxlPSJvcGFjaXR5Oi44Ij48ZGl2IGNsYXNzPSJxLXRleHQiPjxiIGNsYXNzPSJxbiI+RXguPC9iPjxzcGFuPicrZXNjKFAzX0VYQU1QTEUucSkrJyAmbWRhc2g7IGFuc3dlcjogPGI+Jytlc2MoUDNfRVhBTVBMRS5hbnMpKyc8L2I+PC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9InBpYy1tY3EiPic7CiAgICBQM19FWEFNUExFLm9wdHMuZm9yRWFjaChmdW5jdGlvbihvKXsKICAgICAgdmFyIHNlbCA9IG8uaXNBbnN3ZXIgPyAnIHNlbGVjdGVkIGNvcnJlY3Qtb3B0JyA6ICcnOwogICAgICBleEh0bWwgKz0gJzxkaXYgY2xhc3M9InBpYy1vcHQnK3NlbCsnIj48aW1nIHNyYz0iJytvLmltZysnIiBhbHQ9ImV4YW1wbGUgJytvLmxldHRlcisnIj48ZGl2IGNsYXNzPSJwaWMtbGV0dGVyIj48Yj4nK28ubGV0dGVyKyc8L2I+PHNwYW4gY2xhc3M9InBpYy10aWNrIj4nKyhvLmlzQW5zd2VyPydcdTI3MTMnOicnKSsnPC9zcGFuPjwvZGl2PjwvZGl2Pic7CiAgICB9KTsKICAgIGV4SHRtbCArPSAnPC9kaXY+PC9kaXY+JzsKICAgIGxpc3QuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBleEh0bWwpOwogIH0KICBQM19RVUVTVElPTlMuZm9yRWFjaChmdW5jdGlvbihxKXsKICAgIHZhciBoID0gJzxkaXYgY2xhc3M9InEtaXRlbSIgaWQ9InEnK3EubisnIiBkYXRhLXFpZD0iJytxLm4rJyI+PGRpdiBjbGFzcz0icS10ZXh0Ij48YiBjbGFzcz0icW4iPicrcS5uKycuPC9iPjxzcGFuPicrZXNjKHEucSkrJzwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJwaWMtbWNxIj4nOwogICAgcS5vcHRzLmZvckVhY2goZnVuY3Rpb24obyl7CiAgICAgIGggKz0gJzxkaXYgY2xhc3M9InBpYy1vcHQiIGRhdGEtbGV0dGVyPSInK28ubGV0dGVyKyciIGRhdGEtcT0iJytxLm4rJyI+PGltZyBzcmM9Iicrby5pbWcrJyIgYWx0PSJRJytxLm4rJyBvcHRpb24gJytvLmxldHRlcisnIiBsb2FkaW5nPSJsYXp5Ij48ZGl2IGNsYXNzPSJwaWMtbGV0dGVyIj48Yj4nK28ubGV0dGVyKyc8L2I+PHNwYW4gY2xhc3M9InBpYy10aWNrIj5cdTI3MTM8L3NwYW4+PC9kaXY+PC9kaXY+JzsKICAgIH0pOwogICAgaCArPSAnPC9kaXY+PGRpdiBjbGFzcz0iZmVlZGJhY2siPjwvZGl2PjxkaXYgY2xhc3M9InEtYm90dG9tIj48YnV0dG9uIGNsYXNzPSJzaG93LWFucy1idG4iIGRhdGEtc2hvdz0iJytxLm4rJyI+XHV7MUY0NDF9IFNob3cgQW5zd2VyPC9idXR0b24+PC9kaXY+PC9kaXY+JzsKICAgIGxpc3QuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBoKTsKICB9KTsKICAvLyB3aXJlIHBpYyBjbGlja3MKICAkJCgnLnBpYy1vcHRbZGF0YS1xXScpLmZvckVhY2goZnVuY3Rpb24ob3B0KXsKICAgIG9wdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXsKICAgICAgdmFyIHFpZCA9IG9wdC5kYXRhc2V0LnE7CiAgICAgICQkKCcucGljLW9wdFtkYXRhLXE9IicrcWlkKyciXScpLmZvckVhY2goZnVuY3Rpb24obyl7by5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpfSk7CiAgICAgIG9wdC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpOwogICAgICB1cGRhdGVQcm9ncmVzcygpOwogICAgfSk7CiAgfSk7Cn0pKCk7CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogUEFSVCA0IFx1MjAxNCBDT0xPVVIgUEFMRVRURSAoUGFydCA1IHNjZW5lKQogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KdmFyIFA0X3NlbGVjdGVkQ29sb3VyID0gbnVsbDsKdmFyIFA0X3VzZXJDb2xvdXJzID0ge307IC8vIHsgcmVnaW9uOiBjb2xvdXJLZXkgfQp2YXIgUDRfUkVHSU9OX1RPX1FOID0ge307ClA0X0lURU1TLmZvckVhY2goZnVuY3Rpb24oaXQpeyBQNF9SRUdJT05fVE9fUU5baXQucmVnaW9uXT1pdC5uOyB9KTsKCihmdW5jdGlvbigpewogIHZhciBwYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sb3VyUGFsZXR0ZScpOwogIC8vIGVyYXNlciBmaXJzdAogIHZhciBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGVyLmNsYXNzTmFtZT0nc3dhdGNoIGVyYXNlcic7CiAgZXIuZGF0YXNldC5jb2xvdXI9J19fZXJhc2UnOwogIGVyLmlubmVySFRNTD0nPHNwYW4gY2xhc3M9InN3LWxhYmVsIj5lcmFzZXI8L3NwYW4+JzsKICBlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXtzZWxlY3RTd2F0Y2goZXIsJ19fZXJhc2UnKX0pOwogIHBhbC5hcHBlbmRDaGlsZChlcik7CiAgUDRfQ09MT1VSUy5mb3JFYWNoKGZ1bmN0aW9uKGMpewogICAgdmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBzLmNsYXNzTmFtZT0nc3dhdGNoJzsKICAgIHMuc3R5bGUuYmFja2dyb3VuZD1jLmhleDsKICAgIHMuZGF0YXNldC5jb2xvdXI9Yy5rZXk7CiAgICBzLmlubmVySFRNTD0nPHNwYW4gY2xhc3M9InN3LWxhYmVsIj4nK2Mua2V5Kyc8L3NwYW4+JzsKICAgIHMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7c2VsZWN0U3dhdGNoKHMsYy5rZXkpfSk7CiAgICBwYWwuYXBwZW5kQ2hpbGQocyk7CiAgfSk7CgogIGZ1bmN0aW9uIHNlbGVjdFN3YXRjaChlbCxrZXkpewogICAgJCQoJy5zd2F0Y2gnLHBhbCkuZm9yRWFjaChmdW5jdGlvbih4KXt4LmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyl9KTsKICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7CiAgICBQNF9zZWxlY3RlZENvbG91cj1rZXk7CiAgfQoKICAvLyBpbnN0cnVjdGlvbnMKICB2YXIgaW5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbG91ckluc3RydWN0aW9ucycpOwogIGlmKFA0X0VYQU1QTEUpewogICAgaW5zLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywKICAgICAgJzxkaXYgY2xhc3M9ImNvbC1pbnMgZXhhbXBsZSI+PHNwYW4gY2xhc3M9ImNpLW51bSI+RXg8L3NwYW4+PHNwYW4+Jytlc2MoUDRfRVhBTVBMRS5pbnN0cnVjdGlvbikrJzwvc3Bhbj48c3BhbiBjbGFzcz0iY2ktZG90IiBzdHlsZT0iYmFja2dyb3VuZDonK2dldEhleChQNF9FWEFNUExFLmNvbG91cikrJyI+PC9zcGFuPjwvZGl2PicKICAgICk7CiAgICAvLyBwcmUtY29sb3VyIGV4YW1wbGUgcmVnaW9uCiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YXBwbHlDb2xvdXJUb1JlZ2lvbihQNF9FWEFNUExFLnJlZ2lvbixnZXRIZXgoUDRfRVhBTVBMRS5jb2xvdXIpLHRydWUpfSwxNTApOwogIH0KICBQNF9JVEVNUy5mb3JFYWNoKGZ1bmN0aW9uKGl0KXsKICAgIGlucy5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsCiAgICAgICc8ZGl2IGNsYXNzPSJjb2wtaW5zIiBkYXRhLXFuPSInK2l0Lm4rJyI+PHNwYW4gY2xhc3M9ImNpLW51bSI+JytpdC5uKyc8L3NwYW4+PHNwYW4+Jytlc2MoaXQuaW5zdHJ1Y3Rpb24pKyc8L3NwYW4+PHNwYW4gY2xhc3M9ImNpLWRvdCIgZGF0YS1kb3Rmb3I9IicraXQubisnIiBzdHlsZT0iYmFja2dyb3VuZDojZmZmIj48L3NwYW4+PC9kaXY+JwogICAgKTsKICB9KTsKCiAgLy8gd2lyZSBTVkcgcmVnaW9ucwogIHZhciBzY2VuZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xvdXJTY2VuZScpOwogICQkKCdbZGF0YS1yZWdpb25dJyxzY2VuZSkuZm9yRWFjaChmdW5jdGlvbihyZWcpewogICAgcmVnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICBpZighUDRfc2VsZWN0ZWRDb2xvdXIpe2FsZXJ0KCdQbGVhc2UgcGljayBhIGNvbG91ciBmaXJzdCBcdXsxRjNBOH0nKTtyZXR1cm59CiAgICAgIGlmKHJlZy5kYXRhc2V0LmxvY2tlZD09PScxJylyZXR1cm47CiAgICAgIHZhciBya2V5ID0gcmVnLmRhdGFzZXQucmVnaW9uOwogICAgICBpZihQNF9zZWxlY3RlZENvbG91cj09PSdfX2VyYXNlJyl7CiAgICAgICAgYXBwbHlDb2xvdXJUb1JlZ2lvbihya2V5LCcjRkZGRkZGJyxmYWxzZSk7CiAgICAgICAgZGVsZXRlIFA0X3VzZXJDb2xvdXJzW3JrZXldOwogICAgICB9IGVsc2UgewogICAgICAgIGFwcGx5Q29sb3VyVG9SZWdpb24ocmtleSxnZXRIZXgoUDRfc2VsZWN0ZWRDb2xvdXIpLGZhbHNlKTsKICAgICAgICBQNF91c2VyQ29sb3Vyc1tya2V5XT1QNF9zZWxlY3RlZENvbG91cjsKICAgICAgfQogICAgICAvLyB1cGRhdGUgZG90CiAgICAgIHZhciBxbiA9IFA0X1JFR0lPTl9UT19RTltya2V5XTsKICAgICAgaWYocW4pewogICAgICAgIHZhciBkb3QgPSBzY2VuZS5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWRvdGZvcj0iJytxbisnIl0nKTsKICAgICAgICBpZihkb3QpIGRvdC5zdHlsZS5iYWNrZ3JvdW5kID0gKFA0X3NlbGVjdGVkQ29sb3VyPT09J19fZXJhc2UnPycjZmZmJzpnZXRIZXgoUDRfc2VsZWN0ZWRDb2xvdXIpKTsKICAgICAgfQogICAgICB1cGRhdGVQcm9ncmVzcygpOwogICAgfSk7CiAgfSk7CgovKiBGTFlFUlMgUEFSVCAzIFx1MjAxNCBNdWx0aXBsZSBtYXRjaGluZyBBLUggKi8KKGZ1bmN0aW9uKCl7CiAgdmFyIGJhbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncDNMZXR0ZXJCYW5rJyk7CiAgaWYoYmFuayl7CiAgICBQM19MRVRURVJfQkFOSy5mb3JFYWNoKGZ1bmN0aW9uKGIpewogICAgICBiYW5rLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywKICAgICAgICAnPGRpdiBjbGFzcz0ibWF0Y2gtbGV0dGVyIj48Yj4nK2IuTCsnPC9iPiAnK2IubGFiZWwrJzwvZGl2PicpOwogICAgfSk7CiAgfQogIHZhciBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhcnQzTGlzdCcpOwogIGlmKGxpc3QpewogICAgLy8gZXhhbXBsZSByb3cKICAgIGlmKFAzX0VYQU1QTEVfTUFUQ0gpewogICAgICB2YXIgZXg9JzxkaXYgY2xhc3M9InEtaXRlbSByZXZlYWxlZCIgc3R5bGU9Im9wYWNpdHk6Ljg1Ij48ZGl2IGNsYXNzPSJxLXRleHQiPjxiIGNsYXNzPSJxbiI+RXguPC9iPjxzcGFuPicrUDNfRVhBTVBMRV9NQVRDSC5wZXJzb24rJyAmbWRhc2g7IGFuc3dlcjogPGI+JytQM19FWEFNUExFX01BVENILmFucysnPC9iPiAoJytQM19FWEFNUExFX01BVENILndoeSsnKTwvc3Bhbj48L2Rpdj48L2Rpdj4nOwogICAgICBsaXN0Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgZXgpOwogICAgfQogICAgUDNfUVVFU1RJT05TX01BVENILmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICAgIHZhciBvcHRzSFRNTD0nJzsKICAgICAgWydBJywnQicsJ0MnLCdEJywnRScsJ0YnLCdHJywnSCddLmZvckVhY2goZnVuY3Rpb24oTCl7CiAgICAgICAgb3B0c0hUTUwgKz0gJzxsYWJlbCBjbGFzcz0ib3B0IiBkYXRhLWxldHRlcj0iJytMKyciIGRhdGEtcT0iJytxLm4rJyI+PGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJxJytxLm4rJyIgdmFsdWU9IicrTCsnIj48c3BhbiBjbGFzcz0ib3B0LWxldHRlciI+JytMKyc8L3NwYW4+PC9sYWJlbD4nOwogICAgICB9KTsKICAgICAgbGlzdC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsCiAgICAgICAgJzxkaXYgY2xhc3M9InEtaXRlbSIgaWQ9InEnK3EubisnIiBkYXRhLXFpZD0iJytxLm4rJyI+PGRpdiBjbGFzcz0icS10ZXh0Ij48YiBjbGFzcz0icW4iPicrcS5uKycuPC9iPjxzcGFuPicrcS5wZXJzb24rJzwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJxLW9wdHMiPicrb3B0c0hUTUwrJzwvZGl2PjxkaXYgY2xhc3M9ImZlZWRiYWNrIj48L2Rpdj48ZGl2IGNsYXNzPSJxLWJvdHRvbSI+PGJ1dHRvbiBjbGFzcz0ic2hvdy1hbnMtYnRuIiBkYXRhLXNob3c9IicrcS5uKyciPlx1ezFGNDQxfSBTaG93IEFuc3dlcjwvYnV0dG9uPjwvZGl2PjwvZGl2PicpOwogICAgfSk7CiAgICAvLyB3aXJlIGNsaWNrcwogICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm9wdFtkYXRhLXFdJykpLmZvckVhY2goZnVuY3Rpb24ob3B0KXsKICAgICAgb3B0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdmFyIHFpZD1vcHQuZGF0YXNldC5xOwogICAgICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5vcHRbZGF0YS1xPSInK3FpZCsnIl0nKSkuZm9yRWFjaChmdW5jdGlvbihvKXtvLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyl9KTsKICAgICAgICBvcHQuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTsKICAgICAgICB2YXIgaW5wdXQ9b3B0LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7IGlmKGlucHV0KWlucHV0LmNoZWNrZWQ9dHJ1ZTsKICAgICAgICB1cGRhdGVQcm9ncmVzcygpOwogICAgICB9KTsKICAgIH0pOwogIH0KfSkoKTsKCgovKiBGTFlFUlMgUEFSVCA0IFx1MjAxNCBQaWN0dXJlIE1DUSAqLwooZnVuY3Rpb24oKXsKICB2YXIgbGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXJ0NExpc3QnKTsKICBpZighbGlzdClyZXR1cm47CiAgaWYoUDRfRVhBTVBMRV9QSUMpewogICAgdmFyIGV4PSc8ZGl2IGNsYXNzPSJxLWl0ZW0gcmV2ZWFsZWQiIHN0eWxlPSJvcGFjaXR5Oi44Ij48ZGl2IGNsYXNzPSJxLXRleHQiPjxiIGNsYXNzPSJxbiI+RXguPC9iPjxzcGFuPicrUDRfRVhBTVBMRV9QSUMucSsnICZtZGFzaDsgYW5zd2VyOiA8Yj4nK1A0X0VYQU1QTEVfUElDLmFucysnPC9iPjwvc3Bhbj48L2Rpdj48ZGl2IGNsYXNzPSJwaWMtbWNxIj4nOwogICAgUDRfRVhBTVBMRV9QSUMub3B0cy5mb3JFYWNoKGZ1bmN0aW9uKG8pewogICAgICB2YXIgc2VsID0gby5pc0Fuc3dlciA\/ICcgc2VsZWN0ZWQgY29ycmVjdC1vcHQnIDogJyc7CiAgICAgIGV4ICs9ICc8ZGl2IGNsYXNzPSJwaWMtb3B0JytzZWwrJyI+PGltZyBzcmM9Iicrby5pbWcrJyIgYWx0PSJleGFtcGxlICcrby5sZXR0ZXIrJyI+PGRpdiBjbGFzcz0icGljLWxldHRlciI+PGI+JytvLmxldHRlcisnPC9iPjxzcGFuIGNsYXNzPSJwaWMtdGljayI+Jysoby5pc0Fuc3dlcj8nXHUyNzEzJzonJykrJzwvc3Bhbj48L2Rpdj48L2Rpdj4nOwogICAgfSk7CiAgICBleCArPSAnPC9kaXY+PC9kaXY+JzsKICAgIGxpc3QuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBleCk7CiAgfQogIFA0X1FVRVNUSU9OU19QSUMuZm9yRWFjaChmdW5jdGlvbihxKXsKICAgIHZhciBoPSc8ZGl2IGNsYXNzPSJxLWl0ZW0iIGlkPSJxJytxLm4rJyIgZGF0YS1xaWQ9IicrcS5uKyciPjxkaXYgY2xhc3M9InEtdGV4dCI+PGIgY2xhc3M9InFuIj4nK3EubisnLjwvYj48c3Bhbj4nK3EucSsnPC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9InBpYy1tY3EiPic7CiAgICBxLm9wdHMuZm9yRWFjaChmdW5jdGlvbihvKXsKICAgICAgaCArPSAnPGRpdiBjbGFzcz0icGljLW9wdCIgZGF0YS1sZXR0ZXI9Iicrby5sZXR0ZXIrJyIgZGF0YS1xPSInK3EubisnIj48aW1nIHNyYz0iJytvLmltZysnIiBhbHQ9IlEnK3EubisnIG9wdGlvbiAnK28ubGV0dGVyKyciIGxvYWRpbmc9ImxhenkiPjxkaXYgY2xhc3M9InBpYy1sZXR0ZXIiPjxiPicrby5sZXR0ZXIrJzwvYj48c3BhbiBjbGFzcz0icGljLXRpY2siPlx1MjcxMzwvc3Bhbj48L2Rpdj48L2Rpdj4nOwogICAgfSk7CiAgICBoICs9ICc8L2Rpdj48ZGl2IGNsYXNzPSJmZWVkYmFjayI+PC9kaXY+PGRpdiBjbGFzcz0icS1ib3R0b20iPjxidXR0b24gY2xhc3M9InNob3ctYW5zLWJ0biIgZGF0YS1zaG93PSInK3EubisnIj5cdXsxRjQ0MX0gU2hvdyBBbnN3ZXI8L2J1dHRvbj48L2Rpdj48L2Rpdj4nOwogICAgbGlzdC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGgpOwogIH0pOwogIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5waWMtb3B0W2RhdGEtcV0nKSkuZm9yRWFjaChmdW5jdGlvbihvcHQpewogICAgb3B0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogICAgICB2YXIgcWlkPW9wdC5kYXRhc2V0LnE7CiAgICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5waWMtb3B0W2RhdGEtcT0iJytxaWQrJyJdJykpLmZvckVhY2goZnVuY3Rpb24obyl7by5jbGFzc0xpc3QucmVtb3ZlKCdzZWxlY3RlZCcpfSk7CiAgICAgIG9wdC5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpOwogICAgICB1cGRhdGVQcm9ncmVzcygpOwogICAgfSk7CiAgfSk7Cn0pKCk7CgovKiBGTFlFUlMgUEFSVCA1IFx1MjAxNCBXcml0ZS9kcmF3IHF1ZXN0aW9ucyAqLwooZnVuY3Rpb24oKXsKICB2YXIgcDVxdWVzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwNVF1ZXN0aW9ucycpOwogIGlmKHA1cXVlc3QpewogICAgUDVfUVVFU1RJT05TLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICAgIHA1cXVlc3QuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLAogICAgICAgICc8ZGl2IGNsYXNzPSJmb3JtLXJvdyI+PGxhYmVsPjxiPicrcS5uKycuPC9iPiAnK3EubGFiZWwrJzwvbGFiZWw+JysKICAgICAgICAnPGlucHV0IGNsYXNzPSJpbnB1dC1ibGFuayIgZGF0YS1xPSInK3EubisnIiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iLi4uIj4nKwogICAgICAgICc8YnV0dG9uIGNsYXNzPSJzaG93LWFucy1idG4iIGRhdGEtc2hvdz0iJytxLm4rJyI+XHV7MUY0NDF9IFNob3c8L2J1dHRvbj48L2Rpdj4nKTsKICAgIH0pOwogIH0KfSkoKTsKCn0pKCk7CgpmdW5jdGlvbiBnZXRIZXgoY29sb3VyS2V5KXsKICB2YXIgYyA9IFA0X0NPTE9VUlMuZmluZChmdW5jdGlvbih4KXtyZXR1cm4geC5rZXk9PT1jb2xvdXJLZXl9KTsKICByZXR1cm4gYz9jLmhleDonI0ZGRkZGRic7Cn0KZnVuY3Rpb24gYXBwbHlDb2xvdXJUb1JlZ2lvbihyZWdpb24saGV4LGxvY2spewogIHZhciBzY2VuZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sb3VyU2NlbmUnKTsKICAkJCgnW2RhdGEtcmVnaW9uPSInK3JlZ2lvbisnIl0nLHNjZW5lKS5mb3JFYWNoKGZ1bmN0aW9uKGVsKXsKICAgIGVsLnNldEF0dHJpYnV0ZSgnZmlsbCcsaGV4KTsKICAgIGlmKGxvY2spIGVsLmRhdGFzZXQubG9ja2VkPScxJzsKICB9KTsKfQoKdmFyIF9wNUNsZWFyQnRuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwNUNsZWFyJyl8fGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwNENsZWFyJyk7CmlmKF9wNUNsZWFyQnRuKV9wNUNsZWFyQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogIGlmKCFjb25maXJtKCdDbGVhciBhbGwgeW91ciBQYXJ0IDUgY29sb3Vycz8nKSlyZXR1cm47CiAgUDRfSVRFTVMuZm9yRWFjaChmdW5jdGlvbihpdCl7CiAgICBhcHBseUNvbG91clRvUmVnaW9uKGl0LnJlZ2lvbiwnI0ZGRkZGRicsZmFsc2UpOwogICAgdmFyIGRvdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1kb3Rmb3I9IicraXQubisnIl0nKTsKICAgIGlmKGRvdClkb3Quc3R5bGUuYmFja2dyb3VuZD0nI2ZmZic7CiAgfSk7CiAgUDRfdXNlckNvbG91cnM9e307CiAgdXBkYXRlUHJvZ3Jlc3MoKTsKfSk7CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogUFJPR1JFU1MsIFNIT1csIFNVQk1JVAogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZnVuY3Rpb24gYW5zd2VyZWQoKXsKICB2YXIgbj0wOwogIC8vIFAxCiAgZm9yKHZhciBpPTA7aTxQMV9OQU1FUy5sZW5ndGg7aSsrKXt2YXIgbm09UDFfTkFNRVNbaV07IGlmKG5tLmlzRXhhbXBsZSljb250aW51ZTsgaWYobm0uZGlzdHJhY3Rvciljb250aW51ZTsgaWYoUDFfdXNlck1hdGNoZXNbbm0ubl0pbisrO30KICAvLyBQMgogIFAyX1FVRVNUSU9OUy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgdmFyIGVsPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbnB1dC1ibGFua1tkYXRhLXE9IicrcS5uKyciXScpOwogICAgaWYoZWwgJiYgZWwudmFsdWUudHJpbSgpIT09JycpbisrOwogIH0pOwogIC8vIFAzCiAgUDNfUVVFU1RJT05TLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICB2YXIgcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGljLW9wdC5zZWxlY3RlZFtkYXRhLXE9IicrcS5uKyciXScpOwogICAgaWYocyluKys7CiAgfSk7CiAgLy8gUDMgbWF0Y2hpbmcgKEZseWVycyB1c2VzIC5vcHQgaW5zdGVhZCBvZiAucGljLW9wdCkKICBpZih0eXBlb2YgUDNfUVVFU1RJT05TX01BVENIICE9PSAndW5kZWZpbmVkJyl7CiAgICBQM19RVUVTVElPTlNfTUFUQ0guZm9yRWFjaChmdW5jdGlvbihxKXsKICAgICAgdmFyIHNlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5vcHQuc2VsZWN0ZWRbZGF0YS1xPSInK3EubisnIl0nKTsKICAgICAgaWYoc2VsKW4rKzsKICAgIH0pOwogIH0KICAvLyBQNCBwaWN0dXJlIE1DUSAoRmx5ZXJzKQogIGlmKHR5cGVvZiBQNF9RVUVTVElPTlNfUElDICE9PSAndW5kZWZpbmVkJyl7CiAgICBQNF9RVUVTVElPTlNfUElDLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICAgIHZhciBzZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGljLW9wdC5zZWxlY3RlZFtkYXRhLXE9IicrcS5uKyciXScpOwogICAgICBpZihzZWwpbisrOwogICAgfSk7CiAgfQogIC8vIFA1IGNvbG91ciArIHdyaXRlCiAgaWYodHlwZW9mIFA1X0lURU1TX0NPTE9VUiAhPT0gJ3VuZGVmaW5lZCcpewogICAgUDVfSVRFTVNfQ09MT1VSLmZvckVhY2goZnVuY3Rpb24oaXQpeyBpZihQNF91c2VyQ29sb3Vyc1tpdC5yZWdpb25dKW4rKzsgfSk7CiAgfQogIGlmKHR5cGVvZiBQNV9RVUVTVElPTlMgIT09ICd1bmRlZmluZWQnKXsKICAgIFA1X1FVRVNUSU9OUy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgICB2YXIgZWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LWJsYW5rW2RhdGEtcT0iJytxLm4rJyJdJyk7CiAgICAgIGlmKGVsICYmIGVsLnZhbHVlLnRyaW0oKSE9PScnKW4rKzsKICAgIH0pOwogIH0KICByZXR1cm4gbjsKfQpmdW5jdGlvbiB1cGRhdGVQcm9ncmVzcygpewogIHZhciBhPWFuc3dlcmVkKCk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Fuc3dlcmVkQ291bnQnKS50ZXh0Q29udGVudD1hOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9nRmlsbCcpLnN0eWxlLndpZHRoPShhLzI1KjEwMCkrJyUnOwp9Cgpkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JyxmdW5jdGlvbihlKXsKICBpZihlLnRhcmdldC5jbGFzc0xpc3QgJiYgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdpbnB1dC1ibGFuaycpKXVwZGF0ZVByb2dyZXNzKCk7Cn0pOwoKZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CiAgdmFyIGJ0bj1lLnRhcmdldC5jbG9zZXN0KCcuc2hvdy1hbnMtYnRuJyk7CiAgaWYoIWJ0bilyZXR1cm47CiAgdmFyIGtleT1idG4uZGF0YXNldC5zaG93OwogIGlmKGtleT09PSdQMUFMTCcpeyBwMVJldmVhbCgpOyByZXR1cm47IH0KICBpZihrZXk9PT0nUDRBTEwnIHx8IGtleT09PSdQNUFMTCcpeyBwNFJldmVhbCgpOyByZXR1cm47IH0KICB2YXIgcWlkPXBhcnNlSW50KGtleSk7CiAgLy8gd3JpdGUtcXVlc3Rpb24gcmV2ZWFsIChQMiArIFA1IHdyaXRlcykKICBpZigocWlkPj02ICYmIHFpZDw9MTApIHx8IChxaWQ+PTIxICYmIHFpZDw9MjUpKXsKICAgIHZhciBxID0gKHR5cGVvZiBQMl9RVUVTVElPTlMhPT0ndW5kZWZpbmVkJyAmJiBQMl9RVUVTVElPTlMuZmluZChmdW5jdGlvbih4KXtyZXR1cm4geC5uPT09cWlkfSkpIHx8CiAgICAgICAgICAgICh0eXBlb2YgUDVfUVVFU1RJT05TIT09J3VuZGVmaW5lZCcgJiYgUDVfUVVFU1RJT05TLmZpbmQoZnVuY3Rpb24oeCl7cmV0dXJuIHgubj09PXFpZH0pKTsKICAgIHZhciBlbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW5wdXQtYmxhbmtbZGF0YS1xPSInK3FpZCsnIl0nKTsKICAgIGlmKHEgJiYgZWwpewogICAgICBlbC52YWx1ZT1xLmRpc3BsYXk7CiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ3JldmVhbGVkJyk7CiAgICAgIHVwZGF0ZVByb2dyZXNzKCk7CiAgICB9CiAgfQogIGlmKHFpZD49MTEgJiYgcWlkPD0xNSl7CiAgICAvLyBQMyBtdWx0aXBsZSBtYXRjaGluZwogICAgdmFyIHEzID0gKHR5cGVvZiBQM19RVUVTVElPTlNfTUFUQ0ghPT0ndW5kZWZpbmVkJyk\/UDNfUVVFU1RJT05TX01BVENILmZpbmQoZnVuY3Rpb24oeCl7cmV0dXJuIHgubj09PXFpZH0pOm51bGw7CiAgICB2YXIgaXRlbT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncScrcWlkKTsKICAgIGlmKHEzICYmIGl0ZW0pewogICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ3JldmVhbGVkJyk7CiAgICAgICQkKCcub3B0W2RhdGEtcT0iJytxaWQrJyJdJyxpdGVtKS5mb3JFYWNoKGZ1bmN0aW9uKG8pewogICAgICAgIGlmKG8uZGF0YXNldC5sZXR0ZXI9PT1xMy5hbnMpby5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0LW9wdCcpOwogICAgICB9KTsKICAgICAgdmFyIGZiPWl0ZW0ucXVlcnlTZWxlY3RvcignLmZlZWRiYWNrJyk7CiAgICAgIGlmKGZiKXtmYi50ZXh0Q29udGVudD0nQW5zd2VyOiAnK3EzLmFucysocTMud2h5PycgKCcrcTMud2h5KycpJzonJyk7fQogICAgfQogIH0gZWxzZSBpZihxaWQ+PTE2ICYmIHFpZDw9MjApewogICAgLy8gUDQgcGljdHVyZSBNQ1EKICAgIHZhciBxcCA9ICh0eXBlb2YgUDRfUVVFU1RJT05TX1BJQyE9PSd1bmRlZmluZWQnKT9QNF9RVUVTVElPTlNfUElDLmZpbmQoZnVuY3Rpb24oeCl7cmV0dXJuIHgubj09PXFpZH0pOm51bGw7CiAgICB2YXIgaXRlbTI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3EnK3FpZCk7CiAgICBpZihxcCAmJiBpdGVtMil7CiAgICAgIGl0ZW0yLmNsYXNzTGlzdC5hZGQoJ3JldmVhbGVkJyk7CiAgICAgICQkKCcucGljLW9wdFtkYXRhLXE9IicrcWlkKyciXScsaXRlbTIpLmZvckVhY2goZnVuY3Rpb24obyl7CiAgICAgICAgaWYoby5kYXRhc2V0LmxldHRlcj09PXFwLmFucylvLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3Qtb3B0Jyk7CiAgICAgIH0pOwogICAgICB2YXIgZmIyPWl0ZW0yLnF1ZXJ5U2VsZWN0b3IoJy5mZWVkYmFjaycpOwogICAgICBpZihmYjIpe2ZiMi50ZXh0Q29udGVudD0nQW5zd2VyOiAnK3FwLmFuczt9CiAgICB9CiAgfQp9KTsKCmZ1bmN0aW9uIHA0UmV2ZWFsKCl7CiAgaWYodHlwZW9mIFA1X0lURU1TX0NPTE9VUiA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjsKICBQNV9JVEVNU19DT0xPVVIuZm9yRWFjaChmdW5jdGlvbihpdCl7CiAgICBhcHBseUNvbG91clRvUmVnaW9uKGl0LnJlZ2lvbixnZXRIZXgoaXQuY29sb3VyKSx0cnVlKTsKICAgIHZhciBkb3Q9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtZG90Zm9yPSInK2l0Lm4rJyJdJyk7CiAgICBpZihkb3QpZG90LnN0eWxlLmJhY2tncm91bmQ9Z2V0SGV4KGl0LmNvbG91cik7CiAgICB2YXIgaW5zUm93PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb2wtaW5zW2RhdGEtcW49IicraXQubisnIl0nKTsKICAgIGlmKGluc1JvdylpbnNSb3cuY2xhc3NMaXN0LmFkZCgncmV2ZWFsZWQnKTsKICB9KTsKICAkJCgnLnN3YXRjaCcpLmZvckVhY2goZnVuY3Rpb24ocyl7cy5zdHlsZS5wb2ludGVyRXZlbnRzPSdub25lJztzLnN0eWxlLm9wYWNpdHk9Jy42J30pOwogIFA0X3VzZXJDb2xvdXJzID0ge307CiAgUDVfSVRFTVNfQ09MT1VSLmZvckVhY2goZnVuY3Rpb24oaXQpeyBQNF91c2VyQ29sb3Vyc1tpdC5yZWdpb25dPWl0LmNvbG91cjsgfSk7CiAgLy8gYWxzbyByZXZlYWwgdGhlIGRyYXcgd3JpdGUtaW5wdXRzCiAgaWYodHlwZW9mIFA1X1FVRVNUSU9OUyE9PSd1bmRlZmluZWQnKXsKICAgIFA1X1FVRVNUSU9OUy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgICB2YXIgZWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LWJsYW5rW2RhdGEtcT0iJytxLm4rJyJdJyk7CiAgICAgIGlmKGVsKXtlbC52YWx1ZT1xLmRpc3BsYXk7ZWwuY2xhc3NMaXN0LmFkZCgncmV2ZWFsZWQnKTt9CiAgICB9KTsKICB9CiAgdXBkYXRlUHJvZ3Jlc3MoKTsKfQoKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1Ym1pdEJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpewogIHZhciBzY29yZT0wLCBwYXJ0cz17MTowLDI6MCwzOjAsNDowLDU6MH07CgogIFAxX05BTUVTLmZvckVhY2goZnVuY3Rpb24obm0pewogICAgaWYobm0uaXNFeGFtcGxlKXJldHVybjsKICAgIGlmKG5tLmRpc3RyYWN0b3IpcmV0dXJuOwogICAgdmFyIG5hbWVFbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGFpci1uYW1lW2RhdGEtbj0iJytubS5uKyciXScpOwogICAgaWYoUDFfdXNlck1hdGNoZXNbbm0ubl09PT1ubS5hbnMpewogICAgICBzY29yZSsrOyBwYXJ0c1sxXSsrOwogICAgICBpZihuYW1lRWwpe25hbWVFbC5jbGFzc0xpc3QuYWRkKCdtYXRjaGVkJyk7bmFtZUVsLnN0eWxlLmJvcmRlckNvbG9yPSd2YXIoLS1ncmVlbiknO25hbWVFbC5zdHlsZS5iYWNrZ3JvdW5kPSdyZ2JhKDE2LDE4NSwxMjksLjEyKSc7fQogICAgfSBlbHNlIHsKICAgICAgaWYobmFtZUVsKXtuYW1lRWwuc3R5bGUuYm9yZGVyQ29sb3I9J3ZhcigtLXJlZCknO25hbWVFbC5zdHlsZS5iYWNrZ3JvdW5kPSdyZ2JhKDIzOSw2OCw2OCwuMTApJzt9CiAgICB9CiAgfSk7CiAgZHJhd1AxTGluZXMoKTsKCiAgUDJfUVVFU1RJT05TLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICB2YXIgZWw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmlucHV0LWJsYW5rW2RhdGEtcT0iJytxLm4rJyJdJyk7CiAgICBpZighZWwpcmV0dXJuOwogICAgaWYoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXZlYWxlZCcpKXJldHVybjsKICAgIHZhciB2ID0gZWwudmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy4sXSQvLCcnKTsKICAgIHZhciBvayA9IHEuYWNjZXB0ZWQuaW5kZXhPZih2KT49MDsKICAgIGlmKG9rKXtzY29yZSsrO3BhcnRzWzJdKys7ZWwuY2xhc3NMaXN0LmFkZCgnY29ycmVjdCcpO30KICAgIGVsc2Uge2VsLmNsYXNzTGlzdC5hZGQoJ3dyb25nJyk7IGVsLnRpdGxlPSdDb3JyZWN0OiAnK3EuZGlzcGxheTt9CiAgfSk7CgogIC8vIFBBUlQgMyBtdWx0aXBsZSBtYXRjaGluZwogIGlmKHR5cGVvZiBQM19RVUVTVElPTlNfTUFUQ0ghPT0ndW5kZWZpbmVkJyl7CiAgICBQM19RVUVTVElPTlNfTUFUQ0guZm9yRWFjaChmdW5jdGlvbihxKXsKICAgICAgdmFyIGl0ZW09ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3EnK3Eubik7CiAgICAgIGlmKCFpdGVtKXJldHVybjsKICAgICAgdmFyIHNlbD1pdGVtLnF1ZXJ5U2VsZWN0b3IoJy5vcHQuc2VsZWN0ZWQnKTsKICAgICAgdmFyIGxldHRlcj1zZWw\/c2VsLmRhdGFzZXQubGV0dGVyOm51bGw7CiAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnYW5zd2VyZWQnKTsKICAgICAgJCQoJy5vcHQnLGl0ZW0pLmZvckVhY2goZnVuY3Rpb24obyl7CiAgICAgICAgdmFyIEw9by5kYXRhc2V0LmxldHRlcjsKICAgICAgICBpZihMPT09cS5hbnMpby5jbGFzc0xpc3QuYWRkKCdjb3JyZWN0LW9wdCcpOwogICAgICAgIGlmKGxldHRlcj09PUwgJiYgTCE9PXEuYW5zKW8uY2xhc3NMaXN0LmFkZCgnd3Jvbmctb3B0Jyk7CiAgICAgIH0pOwogICAgICB2YXIgZmI9aXRlbS5xdWVyeVNlbGVjdG9yKCcuZmVlZGJhY2snKTsKICAgICAgaWYobGV0dGVyPT09cS5hbnMpe3Njb3JlKys7IHBhcnRzWzNdKys7IGl0ZW0uY2xhc3NMaXN0LmFkZCgnY29ycmVjdCcpOyBpZihmYilmYi50ZXh0Q29udGVudD0nQ29ycmVjdCAtICcrcS5hbnMrKHEud2h5PycgKCcrcS53aHkrJyknOicnKTt9CiAgICAgIGVsc2V7aXRlbS5jbGFzc0xpc3QuYWRkKCd3cm9uZycpOyBpZihmYilmYi50ZXh0Q29udGVudD0nV3JvbmcgLSBjb3JyZWN0OiAnK3EuYW5zKyhxLndoeT8nICgnK3Eud2h5KycpJzonJykrKGxldHRlcj8nICh5b3UgY2hvc2UgJytsZXR0ZXIrJyknOicgKG5vIGFuc3dlciknKTt9CiAgICB9KTsKICB9CgogIC8vIFBBUlQgNCBwaWN0dXJlIE1DUQogIGlmKHR5cGVvZiBQNF9RVUVTVElPTlNfUElDIT09J3VuZGVmaW5lZCcpewogICAgUDRfUVVFU1RJT05TX1BJQy5mb3JFYWNoKGZ1bmN0aW9uKHEpewogICAgICB2YXIgaXRlbT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncScrcS5uKTsKICAgICAgaWYoIWl0ZW0pcmV0dXJuOwogICAgICB2YXIgc2VsPWl0ZW0ucXVlcnlTZWxlY3RvcignLnBpYy1vcHQuc2VsZWN0ZWQnKTsKICAgICAgdmFyIGxldHRlcj1zZWw\/c2VsLmRhdGFzZXQubGV0dGVyOm51bGw7CiAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnYW5zd2VyZWQnKTsKICAgICAgJCQoJy5waWMtb3B0JyxpdGVtKS5mb3JFYWNoKGZ1bmN0aW9uKG8pewogICAgICAgIHZhciBMPW8uZGF0YXNldC5sZXR0ZXI7CiAgICAgICAgaWYoTD09PXEuYW5zKW8uY2xhc3NMaXN0LmFkZCgnY29ycmVjdC1vcHQnKTsKICAgICAgICBpZihsZXR0ZXI9PT1MICYmIEwhPT1xLmFucylvLmNsYXNzTGlzdC5hZGQoJ3dyb25nLW9wdCcpOwogICAgICB9KTsKICAgICAgdmFyIGZiPWl0ZW0ucXVlcnlTZWxlY3RvcignLmZlZWRiYWNrJyk7CiAgICAgIGlmKGxldHRlcj09PXEuYW5zKXtzY29yZSsrOyBwYXJ0c1s0XSsrOyBpdGVtLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3QnKTsgaWYoZmIpZmIudGV4dENvbnRlbnQ9J0NvcnJlY3QgLSAnK3EuYW5zO30KICAgICAgZWxzZXtpdGVtLmNsYXNzTGlzdC5hZGQoJ3dyb25nJyk7IGlmKGZiKWZiLnRleHRDb250ZW50PSdXcm9uZyAtIGNvcnJlY3Q6ICcrcS5hbnMrKGxldHRlcj8nICh5b3UgY2hvc2UgJytsZXR0ZXIrJyknOicgKG5vIGFuc3dlciknKTt9CiAgICB9KTsKICB9CgogIC8vIFBBUlQgNSBjb2xvdXIgKyB3cml0ZQogIGlmKHR5cGVvZiBQNV9JVEVNU19DT0xPVVIhPT0ndW5kZWZpbmVkJyl7CiAgICBQNV9JVEVNU19DT0xPVVIuZm9yRWFjaChmdW5jdGlvbihpdCl7CiAgICAgIHZhciBpbnNSb3c9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbC1pbnNbZGF0YS1xbj0iJytpdC5uKyciXScpOwogICAgICB2YXIgdXNlckNvbCA9IFA0X3VzZXJDb2xvdXJzW2l0LnJlZ2lvbl07CiAgICAgIGlmKHVzZXJDb2wgPT09IGl0LmNvbG91cil7CiAgICAgICAgc2NvcmUrKzsgcGFydHNbNV0rKzsKICAgICAgICBpZihpbnNSb3cpaW5zUm93LmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3QnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZihpbnNSb3cpaW5zUm93LmNsYXNzTGlzdC5hZGQoJ3dyb25nJyk7CiAgICAgIH0KICAgIH0pOwogIH0KICBpZih0eXBlb2YgUDVfUVVFU1RJT05TIT09J3VuZGVmaW5lZCcpewogICAgUDVfUVVFU1RJT05TLmZvckVhY2goZnVuY3Rpb24ocSl7CiAgICAgIHZhciBlbD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW5wdXQtYmxhbmtbZGF0YS1xPSInK3EubisnIl0nKTsKICAgICAgaWYoIWVsKXJldHVybjsKICAgICAgaWYoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdyZXZlYWxlZCcpKXJldHVybjsKICAgICAgdmFyIHYgPSBlbC52YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLixdJC8sJycpOwogICAgICB2YXIgb2sgPSBxLmFjY2VwdGVkLmluZGV4T2Yodik+PTA7CiAgICAgIGlmKG9rKXtzY29yZSsrO3BhcnRzWzVdKys7ZWwuY2xhc3NMaXN0LmFkZCgnY29ycmVjdCcpO30KICAgICAgZWxzZSB7ZWwuY2xhc3NMaXN0LmFkZCgnd3JvbmcnKTsgZWwudGl0bGU9J0NvcnJlY3Q6ICcrcS5kaXNwbGF5O30KICAgIH0pOwogIH0KCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Njb3JlTm93JykudGV4dENvbnRlbnQ9c2NvcmU7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbmFsU2NvcmUnKS50ZXh0Q29udGVudD1zY29yZTsKICB2YXIgcGN0PU1hdGgucm91bmQoc2NvcmUvMjUqMTAwKTsKICB2YXIgbXNnID0gcGN0Pj04NSA\/ICdFeGNlbGxlbnQhIFlvdXIgbGlzdGVuaW5nIGlzIHN0cm9uZy4nCiAgICAgICAgICA6IHBjdD49NzAgPyAnR29vZCBqb2IhIEEgZmV3IG1vcmUgdGVzdHMgYW5kIHlvdSB3aWxsIGJlIHJlYWR5LicKICAgICAgICAgIDogcGN0Pj01MCA\/ICdLZWVwIHByYWN0aXNpbmcgLSByZS1saXN0ZW4gdG8gdGhlIHBhcnRzIHdoZXJlIHlvdSBtaXNzZWQgYW5zd2Vycy4nCiAgICAgICAgICA6ICdUcnkgc2xvd2luZyB0aGUgYXVkaW8gYW5kIHVzZSB0aGUgdHJhbnNjcmlwdCB0byBzdHVkeS4nOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRzTXNnJykudGV4dENvbnRlbnQ9bXNnOwogIHZhciBzcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY29yZVBhcnRzJyk7CiAgc3AuaW5uZXJIVE1MPScnOwogIFsnUGFpcicsJ1dyaXRlJywnTWF0Y2gnLCdUaWNrJywnQ29sb3VyJ10uZm9yRWFjaChmdW5jdGlvbihsYWJlbCxpKXsKICAgIHNwLmlubmVySFRNTCArPSAnPGRpdiBjbGFzcz0ic3AtaXRlbSI+PGI+JytwYXJ0c1tpKzFdKycvNTwvYj5QYXJ0ICcrKGkrMSkrJyAtICcrbGFiZWwrJzwvZGl2Pic7CiAgfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdHNCYW5uZXInKS5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7CiAgc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRzQmFubmVyJykuc2Nyb2xsSW50b1ZpZXcoe2JlaGF2aW9yOidzbW9vdGgnLGJsb2NrOidjZW50ZXInfSl9LDEyMCk7Cn0pOwoKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc2V0QnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7CiAgaWYoIWNvbmZpcm0oJ1Jlc2V0IGFsbCBhbnN3ZXJzPyBZb3VyIG5vdGVzIHdpbGwgYWxzbyBiZSBjbGVhcmVkLicpKXJldHVybjsKICBsb2NhdGlvbi5yZWxvYWQoKTsKfSk7Cgp9KSgpOwo='));<\/script>\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>All English 4U Grammar IELTS TOEFL Cambridge CELPIP Dictation Back Grammar IELTS TOEFL Cambridge CELPIP Dictation Cambridge YLE &#183; Flyers Flyers 2 &mdash; Test 3 Listening Listen to 5 parts with 25 questions. Use YouTube audio, jump to each part, take notes. Each question has its own Show Answer button &mdash; submit panel is at [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-with-title","meta":{"footnotes":""},"class_list":["post-4955","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/4955","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/comments?post=4955"}],"version-history":[{"count":3,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/4955\/revisions"}],"predecessor-version":[{"id":5850,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/4955\/revisions\/5850"}],"wp:attachment":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/media?parent=4955"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}