<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">var colors = {
  red: [
    "01",
    "02",
    "07",
    "08",
    "12",
    "13",
    "18",
    "19",
    "23",
    "24",
    "29",
    "30",
    "34",
    "35",
    "40",
    "45",
    "46",
  ],
  blue: [
    "03",
    "04",
    "09",
    "10",
    "14",
    "15",
    "20",
    "25",
    "26",
    "31",
    "36",
    "37",
    "41",
    "42",
    "47",
    "48",
  ],
  green: [
    "05",
    "06",
    "11",
    "16",
    "17",
    "21",
    "22",
    "27",
    "28",
    "32",
    "33",
    "38",
    "39",
    "43",
    "44",
    "49",
  ],
};
function getColor(num) {
  num = num.toString().padStart(2, "0");
  if (colors.red.includes(num)) {
    return "red";
  } else if (colors.blue.includes(num)) {
    return "blue";
  } else if (colors.green.includes(num)) {
    return "green";
  }
}

class LotteryLive {
  selector = ".lottery-live";
  element = null;
  headerElm = null;
  countdownElm = null;
  dataInit = {};
  socket = null;
  initOption = {
    headerClass: "next-container-header",
    countdownClass: "d-countdown",
  };
  timerCountdown = null;
  dataLottery = {};
  options = {};

  constructor(
    selector,
    options = {
      headerClass: "next-container-header",
      countdownClass: "d-countdown",
      onEndLive: () =&gt; { },
    }
  ) {
    this.selector = selector;
    this.element = $(selector);
    this.init();
    this.bindOptions({
      ...this.initOption,
      ...options
    });
    this.render();
  }

  init() {
    this.element.html(`
          &lt;div class="next-container-header"&gt;&lt;/div&gt;
          &lt;div class="next-container-body"&gt;
        &lt;div class="flex align-center"&gt;
          &lt;div class="flex-1 curNoResult"&gt;&lt;/div&gt;
          &lt;div class="flex-time-box"&gt;
            &lt;div class="count-box"&gt;
              &lt;div class="d-countdown"&gt;&lt;/div&gt;
            &lt;/div&gt;
            &lt;div class="btn-gruop-box"&gt;
              &lt;div class="btn-gruop"&gt;
                &lt;a
                  href="https://tk${subdomain}.xn--v1bar0a7grbxa4db6k.xn--i1b6b1a6a2e"
                  target="_blank"
                  class="ss-btn"
                  style="color:#fff;background-color:#dc9c0f"
                &gt;
                  600å›¾åº“
                &lt;/a&gt;
                &lt;a href="video.html" class="ss-btn ss-btn-error"&gt;
                  ç›´æ’­
                &lt;/a&gt;
              &lt;/div&gt;
              &lt;a href="history.html" class="more-link"&gt;
                æ­·å²é–‹çŽæŸ¥è©¢ &lt;span class="arrow-right"&gt;&lt;/span&gt;
              &lt;/a&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;`);
    this.connectSocket();
  }
  connectSocket() {
    const socket = new io('https://ws.edgoapp.com', {transports: ['websocket']});
    // const socket = new io('ws://ws.edgoapp.com', {
    //     transports: ['websocket'],
    //     secure: false,
    // });
    socket.on("connect", function () {
      console.log("connected");
    });
    socket.on("disconnect", function () {
      console.log("disconnect");
    });
    socket.on("notification", this.socketOnNotification.bind(this));
    socket.on("amloto", this.socketOnAmloto.bind(this));
    this.socket = socket;
  }
  socketOnNotification(data) {
    let numsAm = data?.["2"];
    this.dataLottery.day = numsAm.day;
    let numsAmKj = data?.["2kj"]?.k.split(",");
    this.dataLottery.no = numsAm[0];
    if (!numsAm.hasOwnProperty("p1")) {
      numsAm = Object.values(numsAm).slice(1, 8);
    } else {
      numsAm = numsAmKj.slice(1, 8);
    }
    this.dataLottery.numbers = numsAm
    this.dataLottery.no = numsAmKj[0];
    this.renderResultBox();
  }
  socketOnAmloto(data) {
    const [no, p1, p2, p3, p4, p5, p6, t, nextPeriod] = data;
    const numbers = [p1, p2, p3, p4, p5, p6, t]
    this.dataLottery = {
      ...this.dataLottery,
      no,
      nextPeriod,
      numbers,
    };
    this.dataLottery.day = new Date();
    this.renderResultBox();
    if (this.options.onEndLive &amp;&amp; numbers.every((num) =&gt; parseInt(num))) {
      this.options.onEndLive({
        no,
        numbers,
      });
    }
  }
  bindOptions(options) {
    const { headerClass, countdownClass = "d-countdown" } = options;
    this.headerElm = this.element.find(`.${headerClass}`);
    this.countdownElm = this.element.find(`.${countdownClass}`);
    this.options = options;
  }

  render() {
    this.renderHeader();
    this.renderCountdown();
  }

  renderHeader() {
    this.headerElm.html(`
        &lt;span class="fr"&gt;
       ç¬¬&lt;span class="nxtNo"&gt;&lt;/span&gt;æœŸæˆªè‡³æ™‚é–“ï¼š&lt;span class="nxtTime"&gt;&lt;/span&gt;
        &lt;/span&gt;
        &lt;div class="fr mobile-fr"&gt;
          &lt;div class="lottery-issue"&gt;
            ç¬¬ &lt;span class="color-error nxtNo"&gt;&lt;/span&gt; æœŸ
          &lt;/div&gt;
          &lt;div class="next-open-time"&gt;
            &lt;p class="text"&gt;ä¸‹æœŸæˆªæ­¢æ™‚é–“&lt;/p&gt;
            &lt;p class="time"&gt;&lt;/p&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        æ¾³é–€å®˜æ–¹å…­åˆå½©
      `);
  }
  renderResultBox() {
    const resultBox = this.element.find(".curNoResult");
    const { no, numbers } = this.dataLottery;
    const now = this.dataLottery.day ? new Date(this.dataLottery.day) : new Date();
    const year = now.getFullYear();
    const month = now.getMonth() + 1;
    const day = now.getDate();

    const numbersHtml = numbers
      .map((num) =&gt; {
        return `&lt;div class="item"&gt;&lt;span class="${getColor(num)}"&gt;${isNaN(parseInt(num)) || parseInt(num) === 0 ? num : num.toString().padStart(2, "0")}&lt;/span&gt;
                &lt;p&gt;${this.getXIAO(num, `${year}-${month.toString().padStart(2, "0")}-${day.toString().padStart(2, "0")}`)}&lt;/p&gt;
            &lt;/div&gt;`;
      })
      .join("");

    resultBox.html(
      `&lt;div class="lottery-issue"&gt;&lt;span class="bold"&gt;æ¾³é–€å…­åˆå½©&lt;/span&gt;&lt;span&gt;ç¬¬&lt;span class="color-error"&gt;${no}&lt;/span&gt;æœŸ&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class="winning-numers winning-numers-large winning-numers-plus"&gt;
           ${numbersHtml}
      &lt;/div&gt;`
    );
  }

  renderCountdown() {
    const nowUtc8 = new Date(new Date().toLocaleString("en-US", { timeZone: "Asia/Macau" }));
    let timeOpen = new Date(new Date().setHours(21, 30, 0, 0));
    let timeDiff = timeOpen - nowUtc8;
    if (timeDiff &lt; 0) {
      if (timeDiff &lt; -1000 * 60 * 5) {
        timeOpen = new Date(new Date().setHours(21, 30, 0, 0) + 1000 * 60 * 60 * 24);
        timeDiff = timeOpen - nowUtc8;
      } else {
        timeDiff = 0
      }
    }

    const hoursDiff = Math.floor(timeDiff / 1000 / 60 / 60);
    const minutesDiff = Math.floor((timeDiff / 1000 / 60) % 60);
    const secondsDiff = Math.floor((timeDiff / 1000) % 60);
    const countdownTimeString = `${this.formatTimeToString(
      hoursDiff
    )}:${this.formatTimeToString(minutesDiff)}:${this.formatTimeToString(
      secondsDiff
    )}`;

    const countdownHtml = countdownTimeString
      .split("")
      .map((item) =&gt; {
        return `&lt;span class="count-item"&gt;${item}&lt;/span&gt;`;
      })
      .join("");


    this.countdownElm.html(countdownHtml);
    clearTimeout(this.timerCountdown);
    this.timerCountdown = setTimeout(() =&gt; {
      this.renderCountdown();
    }, 1000);
  }
  formatTimeToString(time) {
    return Math.floor(time).toString().padStart(2, "0");
  }
  getXIAO(num, date) {
    let lunayear = AnimalsHelper.getYearLunar(date);
    AnimalsHelper.addYear(lunayear);
    num = parseInt(num);
    if (num &gt; 0 &amp;&amp; num &lt; 50) {
      return AnimalsHelper.getHMSHENGXIAO(
        num &gt; 9 ? num.toString() : num == 0 ? 0 : "0" + num.toString(),
        date
      );
    } else {
      return "ç™¼";
    }
  }
  getColor(num) {
    num = num.toString().padStart(2, "0");
    if (colors.red.includes(num)) {
      return "red";
    } else if (colors.blue.includes(num)) {
      return "blue";
    } else if (colors.green.includes(num)) {
      return "green";
    }
  }
  addDate(days) {
    const date = new Date();
    date.setDate(date.getDate() + days);
    return date;
  }
}



class LotteryHistory {
  options = null
  data = []
  lotterytWatch = null
  constructor(element, options) {
    this.element = $(element);
    this.options = options;
    this.init();
  }
  init() {
    this.renderInit()
    this.fetchHistory();
  }
  renderInit() {
    this.element.html(
      `&lt;div class="recent-container" style="margin-bottom:0"&gt;
      &lt;ul class="recent-box"&gt;
      &lt;/ul&gt;
      &lt;div class="video-trace__wrapper" style="display:none"&gt;
      &lt;/div&gt;
    &lt;/div&gt;`);
  }
  renderHistory() {
    const header = ` &lt;li class="flex align-center"&gt;&lt;span&gt;æœŸè™Ÿ&lt;/span&gt;&lt;span&gt;é–‹çŽæ™‚é–“&lt;/span&gt;&lt;span class="flex-1"&gt;ä¸­çŽè™Ÿç¢¼&lt;/span&gt;&lt;span&gt;é–‹çŽå›žæ”¾&lt;/span&gt; &lt;/li&gt;`
    const data = this.data.sort((a, b) =&gt; b.no - a.no);

    const html = data.map((item) =&gt; {
      const numbers = [item.p1, item.p2, item.p3, item.p4, item.p5, item.p6, item.t]
      return `
        &lt;li class="flex align-center"&gt;&lt;span&gt;ç¬¬ &lt;span class="color-error"&gt;${item.no}&lt;/span&gt;
          æœŸ&lt;/span&gt;&lt;span&gt;${item.day}&lt;/span&gt;&lt;span class="flex-1"&gt;
            &lt;div class="winning-numers winning-numers-default winning-numers-plus"&gt;
              ${this.getHtmlNumbers(numbers, item.day)}
            &lt;/div&gt;
          &lt;/span&gt;&lt;span&gt;
            &lt;div class="video-button" data-no="${item.no}"&gt;å›žæ”¾&lt;/div&gt;
          &lt;/span&gt;&lt;/li&gt;`
    }).join("")
    const box = this.element.find(".recent-box")
    box.html(header + html)
    this.bindPlay()
  }
  bindPlay() {
    const btn = this.element.find(".video-button");
    btn.on("click", (e) =&gt; {
      const no = $(e.currentTarget).data("no");
      this.lotterytWatch = this.data.find((item) =&gt; item.no == no);
      this.renderVideoPopup();
    });
  }
  getHtmlNumbers(numbers, day) {
    return numbers
      .map((num) =&gt; {
        return `&lt;div class="item"&gt;&lt;span class="${getColor(num)}"&gt;${isNaN(parseInt(num)) || parseInt(num) === 0 ? num : num.toString().padStart(2, "0")}&lt;/span&gt;
                &lt;p&gt;${this.getXIAO(num, day)}&lt;/p&gt;
            &lt;/div&gt;`;
      })
      .join("");
  }
  fetchHistory = () =&gt; {
    $.ajax({
      url: "https://tkapi3.352722.com/static/draws/am_kj.json?"
    }).done((res) =&gt; {
      const data = res.data;
      this.setHistory(data?.slice(0, 5) || []);
      this.renderHistory();
    }).fail((err) =&gt; {
      console.log(err);
    });
  }
  addToHistory(data) {
    const isExist = this.data.find((item) =&gt; item.no === data.no);
    if (isExist) {
      return;
    }
    this.data.push(data);
    this.renderHistory();
  }
  setHistory(data) {
    this.data = data;
  }
   getXIAO(num, date) {
    let lunayear = AnimalsHelper.getYearLunar(date);
    AnimalsHelper.addYear(lunayear);
    num = parseInt(num);
    if (num &gt; 0 &amp;&amp; num &lt; 50) {
      return AnimalsHelper.getHMSHENGXIAO(
        num &gt; 9 ? num.toString() : num == 0 ? 0 : "0" + num.toString(),
        date
      );
    } else {
      return "ç™¼";
    }
  }
  renderVideoPopup() {
    const videoPopup = this.element.find(".video-trace__wrapper");
    videoPopup.css({
      display: "block",
    })
    videoPopup.html(this.getVideoPopupHtml());
    const closeBtn = videoPopup.find(".video-close");
    closeBtn.on("click", () =&gt; {
      videoPopup.css({
        display: "none",
      });
    });
  }
  getVideoPopupHtml() {
    const his = this.lotterytWatch
    const numbers = [his.p1, his.p2, his.p3, his.p4, his.p5, his.p6, his.t]
    const day = his.day
    return `&lt;div role="dialog" aria-modal="true" class="video-trace"&gt;
    &lt;div class="video-trace__head"&gt;&lt;span class="videoName"&gt;æ¾³é–€å…­åˆå½©&lt;/span&gt;&lt;span
            class="videoIssue"&gt;ç¬¬&lt;span&gt;${his.no}&lt;/span&gt; æœŸ&lt;/span&gt;&lt;span class="videoTitle"&gt;å›žæ”¾&lt;/span&gt;
        &lt;div class="videoMessage"&gt;
            &lt;div class="videoTime"&gt;é–‹çŽæ™‚é–“ï¼š${his.day}&lt;/div&gt;
            &lt;div class="videoCode"&gt;
                &lt;div class="winning-numers winning-numers-default winning-numers-plus"&gt;
                    ${this.getHtmlNumbers(numbers, day)}
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
      &lt;img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsSAAALEgHS3X78AAACd0lEQVRIx7WXSU9UURCFv/NkNii4MIIChogEjAYNhoXBaIIEFiYa4z80rl05gIlDcFgYFUWjIu2UCK4QUcCgfVz0e9pNut+AzVl131uvvlfVdavripSy3QG0A7uAncCOcGsZWAIWgQVJ79L4UwrgANAXAtNoCXgFTEtazwy23QUMh9FtRivAlKTZ1GDbQ8DgJoEbNSPpTiLY9kngcJWgkXKSrhUvBGUirTYUoNv26bJg2+1UL73l1G+7p1zEY1sIjTRiu/Yv2PYRoDHmgSUgn9L5YsxeABwvjvhYnCNJl4ArKaCTki4DCzE2A7YV2N4HbI8xrLfdKWkemIixm5L0xvbuhOwJOBAAnQlRNAFnbfeEzaAc/J6k6bBAL5LcdLprgJYUKQQYtZ2XNGs7z79inCqCnk/pqyULGGDM9kQIfwDUhdC2DFCAphqgOcMDUeTNkh4D2O4FRjL6qA0yPhCpvuhz3WYc1ADfyZbu6DftBeolPbP9AxjP4GM9oNAc0iqq3j0U0jtsu1tSDriZwc9qAHzNEOnTsHovFK2P2z4o6TVwPaWvbwHwKcFoDbgVRrqX8tV7Jjznc8BVCkNAnHKBpA+h80pakfTSditwLsZu1HZHOHMlZXFWALYHgaEYw3mgFWhIcPgb+EJhKKykF5JuBwCSHgG/YozbUkABtiVAAR5C6f/xZArH/6u7ktZKwOGRmNlCaE7S8+hLSecKp8G5LYB+3jjsVRpvTwGHqgR9K+nGxsW4gb4POEFpX86iPHBf0nS5zdgrjO0G4CjQT7qqBlincIV5Imm5klHi3Sl8gVpgP9BF4Tw3Fr3IT2CVQtP4CLyPKjdOfwCD1OXshuZzsgAAAABJRU5ErkJggg==" alt="" class="video-close close"&gt;
    &lt;/div&gt;&lt;video src="https://video.664460.com/video/${his.year}/${his.no}.mp4" autoplay="autoplay"&gt;&lt;/video&gt;
&lt;/div&gt;`
  }

}
</pre></body></html>