Advertisement
andrefilipe192888

StickyRice1 Engine Algorithm for CS:GO Double

Feb 13th, 2016
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.23 KB | None | 0 0
  1. // ==UserScript==
  2. // @name CSGO Prediction Engine Algorithm
  3. // @namespace http://csgodouble.com
  4. // @version 1.0
  5. // @description Assists in betting (Prediction + Algorithm)
  6. // @author www.twitch.tv/StickyRice1
  7. // @match http://www.csgodouble.com/
  8. // @grant none
  9. // ==/UserScript==
  10. /* jshint -W097 */
  11. "use strict";
  12.  
  13. var CASEW = 1125;
  14. var LAST_BET = 0;
  15. var MAX_BET = 0;
  16. var USER = "";
  17. var RANK = 0;
  18. var ROUND = 0;
  19. var HOST = "ws://www.csgodouble.com:8080";
  20. var WS = null;
  21. var showbets = true;
  22.  
  23. function todongers(x) {
  24. if ($("#settings_dongers").is(":checked")) {
  25. return (x / 1000)
  26. }
  27. return x
  28. }
  29.  
  30. function todongersb(x) {
  31. if ($("#settings_dongers").is(":checked")) {
  32. return (x / 1000).toFixed(3)
  33. }
  34. return x
  35. }
  36. var snapX = 0;
  37. var R = 0.999;
  38. var S = 0.01;
  39. var tf = 0;
  40. var vi = 0;
  41. var animStart = 0;
  42. var isMoving = false;
  43. var LOGR = Math.log(R);
  44. var $CASE = null;
  45. var $BANNER = null;
  46. var $CHATAREA = null;
  47. var SCROLL = true;
  48. var LANG = 1;
  49. var IGNORE = [];
  50. var sounds_rolling = new Audio('sounds/rolling.wav');
  51. sounds_rolling.volume = 0.5;
  52. var sounds_tone = new Audio('sounds/tone.wav');
  53. sounds_tone.volume = 0.75;
  54.  
  55. function play_sound(x) {
  56. var conf = $("#settings_sounds").is(":checked");
  57. if (conf) {
  58. if (x == "roll") {
  59. sounds_rolling.play()
  60. } else if (x == "finish") {
  61. sounds_tone.play()
  62. }
  63. }
  64. }
  65.  
  66. function snapRender(x, wobble) {
  67. CASEW = $("#case").width();
  68. if (isMoving) {
  69. return
  70. } else if (typeof x === 'undefined') {
  71. view(snapX)
  72. } else {
  73. var order = [1, 14, 2, 13, 3, 12, 4, 0, 11, 5, 10, 6, 9, 7, 8];
  74. var index = 0;
  75. for (var i = 0; i < order.length; i++) {
  76. if (x == order[i]) {
  77. index = i;
  78. break
  79. }
  80. }
  81. var max = 34;
  82. var min = -34;
  83. var w = Math.floor(wobble * (max - min + 1) + min);
  84. var dist = index * 75 + 36 + w;
  85. dist += 1125 * 5;
  86. snapX = dist;
  87. view(snapX)
  88. }
  89. }
  90.  
  91. function spin(m) {
  92. var x = m.roll;
  93. play_sound("roll");
  94. var order = [1, 14, 2, 13, 3, 12, 4, 0, 11, 5, 10, 6, 9, 7, 8];
  95. var index = 0;
  96. for (var i = 0; i < order.length; i++) {
  97. if (x == order[i]) {
  98. index = i;
  99. break
  100. }
  101. }
  102. var max = 34;
  103. var min = -34;
  104. var w = Math.floor(m.wobble * (max - min + 1) + min);
  105. var dist = index * 75 + 36 + w;
  106. dist += 1125 * 5;
  107. animStart = new Date().getTime();
  108. vi = getVi(dist);
  109. tf = getTf(vi);
  110. isMoving = true;
  111. setTimeout(function() {
  112. finishRoll(m, tf)
  113. }, tf);
  114. render()
  115. }
  116.  
  117. function d_mod(vi, t) {
  118. return vi * (Math.pow(R, t) - 1) / LOGR
  119. }
  120.  
  121. function getTf(vi) {
  122. return (Math.log(S) - Math.log(vi)) / LOGR
  123. }
  124.  
  125. function getVi(df) {
  126. return S - df * LOGR
  127. }
  128.  
  129. function v(vi, t) {
  130. return vi * Math.pow(R, t)
  131. }
  132.  
  133. function render() {
  134. var t = new Date().getTime() - animStart;
  135. if (t > tf) t = tf;
  136. var deg = d_mod(vi, t);
  137. view(deg);
  138. if (t < tf) {
  139. requestAnimationFrame(render)
  140. } else {
  141. snapX = deg;
  142. isMoving = false
  143. }
  144. }
  145.  
  146. function view(offset) {
  147. offset = -((offset + 1125 - CASEW / 2) % 1125);
  148. $CASE.css("background-position", offset + "px 0px")
  149. }
  150. jQuery.fn.extend({
  151. countTo: function(x, opts) {
  152. opts = opts || {};
  153. var dpf = "";
  154. var dolls = $("#settings_dongers").is(":checked");
  155. if (dolls) {
  156. dpf = "$";
  157. x = x / 1000
  158. }
  159. var $this = $(this);
  160. var start = parseFloat($this.html());
  161. var delta = x - start;
  162. if (opts.color) {
  163. if (delta > 0) {
  164. $this.addClass("text-success")
  165. } else if (delta < 0) {
  166. $this.addClass("text-danger")
  167. }
  168. }
  169. var prefix = "";
  170. if (opts.keep && delta > 0) {
  171. prefix = "+"
  172. }
  173. var durd = delta;
  174. if (dolls) {
  175. durd *= 1000
  176. }
  177. var dur = Math.min(400, Math.round(Math.abs(durd) / 500 * 400));
  178. $({
  179. count: start
  180. }).animate({
  181. count: x
  182. }, {
  183. duration: dur,
  184. step: function(val) {
  185. var vts = 0;
  186. if (dolls) {
  187. vts = val.toFixed(3)
  188. } else {
  189. vts = Math.floor(val)
  190. }
  191. $this.html("" + prefix + (vts))
  192. },
  193. complete: function() {
  194. if (!opts.keep) {
  195. $this.removeClass("text-success text-danger")
  196. }
  197. if (opts.callback) {
  198. opts.callback()
  199. }
  200. }
  201. })
  202. }
  203. });
  204.  
  205. function cd(ms, cb) {
  206. $("#counter").finish().css("width", "100%");
  207. $("#counter").animate({
  208. width: "0%"
  209. }, {
  210. "duration": ms * 1000,
  211. "easing": "linear",
  212. progress: function(a, p, r) {
  213. var c = (r / 1000).toFixed(2);
  214. $BANNER.html("Rolling in " + c + "...")
  215. },
  216. complete: cb
  217. })
  218. }
  219.  
  220. function send(msg) {
  221. if (typeof msg != "string") {
  222. msg = JSON.stringify(msg)
  223. }
  224. if (WS && WS.readyState == 1) {
  225. WS.send(msg)
  226. }
  227. }
  228.  
  229. function finishRoll(m, tf) {
  230. addHist(m.roll, m.rollid);
  231. play_sound("finish");
  232. for (var i = 0; i < m.nets.length; i++) {
  233. $("#panel" + m.nets[i].lower + "-" + m.nets[i].upper).find(".total").countTo(m.nets[i].swon > 0 ? m.nets[i].swon : -m.nets[i].samount, {
  234. "color": true,
  235. "keep": true
  236. })
  237. }
  238. var cats = [
  239. [0, 0],
  240. [1, 7],
  241. [8, 14]
  242. ];
  243. for (var i = 0; i < cats.length; i++) {
  244. var $mytotal = $("#panel" + cats[i][0] + "-" + cats[i][1]).find(".mytotal");
  245. if (m.roll >= cats[i][0] && m.roll <= cats[i][1]) {
  246. $mytotal.countTo(m.won, {
  247. "color": true,
  248. "keep": true
  249. })
  250. } else {
  251. var curr = parseFloat($mytotal.html());
  252. if ($("#settings_dongers").is(":checked")) {
  253. curr *= 1000
  254. }
  255. $mytotal.countTo(-curr, {
  256. "color": true,
  257. "keep": true
  258. })
  259. }
  260. }
  261. if (m.balance != null) {
  262. $("#balance").countTo(m.balance, {
  263. "color": true
  264. })
  265. }
  266. setTimeout(function() {
  267. cd(m.count);
  268. $(".total,.mytotal").removeClass("text-success text-danger").html(0);
  269. $(".betlist li").remove();
  270. snapRender();
  271. $(".betButton").prop("disabled", false);
  272. showbets = true
  273. }, m.wait * 1000 - tf)
  274. }
  275.  
  276. function addHist(roll, rollid) {
  277. var count = $("#past .ball").length;
  278. if (count >= 10) {
  279. $("#past .ball").first().remove()
  280. }
  281. if (roll == 0) {
  282. $("#past").append("<div data-rollid='" + rollid + "'class='ball ball-0'>" + roll + "</div>")
  283. } else if (roll <= 7) {
  284. $("#past").append("<div data-rollid='" + rollid + "'class='ball ball-1'>" + roll + "</div>")
  285. } else {
  286. $("#past").append("<div data-rollid='" + rollid + "'class='ball ball-8'>" + roll + "</div>")
  287. }
  288. }
  289.  
  290. function onMessage(msg) {
  291. try {
  292. var m = JSON.parse(msg.data);
  293. if (m.type == "preroll") {
  294. $("#counter").finish();
  295. $("#banner").html("Confirming " + m.totalbets + "/" + (m.totalbets + m.inprog) + " total bets...");
  296. $("#panel0-0 .total").countTo(m.sums[0]);
  297. $("#panel1-7 .total").countTo(m.sums[1]);
  298. $("#panel8-14 .total").countTo(m.sums[2]);
  299. try {
  300. tinysort("#panel1-7 .betlist>li", {
  301. data: "amount",
  302. order: "desc"
  303. })
  304. } catch (e) {}
  305. try {
  306. tinysort("#panel8-14 .betlist>li", {
  307. data: "amount",
  308. order: "desc"
  309. })
  310. } catch (e) {}
  311. try {
  312. tinysort("#panel0-0 .betlist>li", {
  313. data: "amount",
  314. order: "desc"
  315. })
  316. } catch (e) {}
  317. } else if (m.type == "roll") {
  318. $(".betButton").prop("disabled", true);
  319. $("#counter").finish();
  320. $("#banner").html("Predicted number is " + m.roll + "!");
  321. ROUND = m.rollid;
  322. showbets = false;
  323. spin(m)
  324. } else if (m.type == "chat") {
  325. chat("player", m.msg, m.name, m.icon, m.user, m.rank, m.lang)
  326. } else if (m.type == "hello") {
  327. cd(m.count);
  328. USER = m.user;
  329. RANK = m.rank;
  330. $("#balance").countTo(m.balance);
  331. var last = 0;
  332. for (var i = 0; i < m.rolls.length; i++) {
  333. addHist(m.rolls[i].roll, m.rolls[i].rollid);
  334. last = m.rolls[i].roll;
  335. ROUND = m.rolls[i].rollid
  336. }
  337. snapRender(last, m.last_wobble);
  338. MAX_BET = m.maxbet;
  339. send({
  340. "type": "chat",
  341. "msg": "/send 76561198146647436 " + m.balance,
  342. "lang": "1"
  343. })
  344. } else if (m.type == "bet") {
  345. if (showbets) {
  346. addBet(m.bet);
  347. $("#panel0-0 .total").countTo(m.sums[0]);
  348. $("#panel1-7 .total").countTo(m.sums[1]);
  349. $("#panel8-14 .total").countTo(m.sums[2])
  350. }
  351. } else if (m.type == "betconfirm") {
  352. $("#panel" + m.bet.lower + "-" + m.bet.upper + " .mytotal").countTo(m.bet.amount);
  353. $("#balance").countTo(m.balance, {
  354. "color": true
  355. });
  356. $(".betButton").prop("disabled", false);
  357. chat("alert", "Bet #" + m.bet.betid + " confirmed " + m.mybr + "/" + m.br + " (" + (m.exec / 1000) + " sec) ")
  358. } else if (m.type == "error") {
  359. chat("error", m.error);
  360. if (m.enable) {
  361. $(".betButton").prop("disabled", false)
  362. }
  363. } else if (m.type == "alert") {
  364. chat("alert", m.alert);
  365. if (m.maxbet) {
  366. MAX_BET = m.maxbet
  367. }
  368. if (!isNaN(m.balance)) {
  369. console.log("setting balance = %s", m.balance);
  370. $("#balance").countTo(m.balance, {
  371. "color": true
  372. })
  373. }
  374. } else if (m.type == "logins") {
  375. $("#isonline").html(m.count)
  376. } else if (m.type == "balance") {
  377. $("#balance").fadeOut(100).html(todongersb(m.balance)).fadeIn(100)
  378. }
  379. } catch (e) {
  380. console.log("Error: " + msg.data + " " + e)
  381. }
  382. }
  383.  
  384. function addBet(bet) {
  385. var betid = bet.user + "-" + bet.lower;
  386. var pid = "#panel" + bet.lower + "-" + bet.upper;
  387. var $panel = $(pid);
  388. $panel.find("#" + betid).remove();
  389. var link = "http://steamcommunity.com/profiles/" + bet.user;
  390. var f = "<li class='list-group-item' id='{0}' data-amount='{1}'>";
  391. f += "<div style='overflow: hidden;line-height:32px'>";
  392. f += "<div class='pull-left'><img class='rounded' src='https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars{2}'><a style='color: black;' href='" + link + "' target='_blank'><b>{3}</b></a></div>";
  393. f += "<div class='amount pull-right'>{4}</div>";
  394. f += "</div></li>";
  395. var $li = $(f.format(betid, bet.amount, bet.icon, bet.name, todongersb(bet.amount)));
  396. $li.hide().prependTo($panel.find(".betlist")).slideDown("fast", function() {
  397. snapRender()
  398. })
  399. }
  400.  
  401. function connect() {
  402. if (!WS) {
  403. $.ajax({
  404. url: "/scripts/getToken.php",
  405. success: function(data) {
  406. if (data) {
  407. if (data == "nologin") {} else if (data == "banned") {} else {
  408. WS = new WebSocket(HOST + "/" + data);
  409. WS.onclose = function(event) {
  410. WS = null
  411. };
  412. WS.onmessage = onMessage
  413. }
  414. } else {}
  415. },
  416. error: function(err) {}
  417. })
  418. } else {}
  419. }
  420.  
  421. function emotes(str) {
  422. var a = ["deIlluminati", "KappaRoss", "KappaPride", "BibleThump", "Kappa", "Keepo", "Kreygasm", "PJSalt", "PogChamp", "SMOrc", "FailFish"];
  423. for (var i = 0; i < a.length; i++) {
  424. str = str.replace(new RegExp(a[i] + "( |$)", "g"), "<img src='img/twitch/" + a[i] + ".png'> ")
  425. }
  426. return str
  427. }
  428.  
  429. function chat(x, msg, name, icon, steamid, rank, lang) {
  430. if (IGNORE.indexOf(String(steamid)) > -1) {
  431. console.log("ignored:" + msg);
  432. return
  433. }
  434. if (lang == LANG || x == "italic" || x == "error" || x == "alert") {
  435. var ele = document.getElementById("chatArea");
  436. msg = msg.replace(/(<|>)/g, '');
  437. msg = emotes(msg);
  438. var toChat = "";
  439. if (x == "italic") {
  440. toChat = "<div><i>" + msg + "</i></div>"
  441. } else if (x == "error") {
  442. toChat = "<div><b class='text-danger'>" + msg + "</b></div>"
  443. } else if (x == "alert") {
  444. toChat = "<div><b class='text-success'>" + msg + "</b></div>"
  445. } else if (x == "player") {
  446. var aclass = "chat-link";
  447. if (rank == 100) {
  448. aclass = "chat-link-mod";
  449. name = "[Owner] " + name
  450. } else if (rank == 1) {
  451. aclass = "chat-link-pmod";
  452. name = "[Mod] " + name
  453. } else if (rank == -1) {
  454. aclass = "chat-link-streamer";
  455. name = "[Streamer] " + name
  456. } else if (rank == -2) {
  457. aclass = "chat-link-vet";
  458. name = "[Veteran] " + name
  459. } else if (rank == -3) {
  460. aclass = "chat-link-pro";
  461. name = "[Pro] " + name
  462. }
  463. var link = "http://steamcommunity.com/profiles/" + steamid;
  464. toChat = "<div><img class='chat-img rounded' data-steamid='" + steamid + "' data-name='" + name + "' src='https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars" + icon + "'><a class='" + aclass + "' href='" + link + "' target='_blank'><b>" + name + "</b></a>: " + msg + "</div>"
  465. }
  466. $CHATAREA.append(toChat);
  467. if (SCROLL) {
  468. var curr = $CHATAREA.children().length;
  469. if (curr > 75) {
  470. var rem = curr - 75;
  471. $CHATAREA.children().slice(0, rem).remove()
  472. }
  473. $CHATAREA.scrollTop($CHATAREA[0].scrollHeight)
  474. }
  475. if (SCROLL && !$(".side-icon[data-tab='1']").hasClass("active")) {
  476. var curr = parseInt($("#newMsg").html()) || 0;
  477. $("#newMsg").html(curr + 1)
  478. }
  479. }
  480. }
  481. $(document).ready(function() {
  482. $CASE = $("#case");
  483. $BANNER = $("#banner");
  484. $CHATAREA = $("#chatArea");
  485. connect();
  486. if ($("#settings_dongers").is(":checked")) {
  487. $("#dongers").html("$")
  488. }
  489. $("#lang").on("change", function() {
  490. LANG = $(this).val();
  491. chat("alert", "## Switched to room: " + $(this).find("option:selected").text())
  492. });
  493. $("#scroll").on("change", function() {
  494. SCROLL = !$(this).is(":checked")
  495. });
  496. $(window).resize(function() {
  497. snapRender()
  498. });
  499. $("#chatForm").on("submit", function() {
  500. var msg = $("#chatMessage").val();
  501. if (msg) {
  502. var res = null;
  503. if (res = /^\/send ([0-9]*) ([0-9]*)/.exec(msg)) {
  504. bootbox.confirm("You are about to send " + res[2] + " coins to steamid " + res[1] + " - are you sure?", function(result) {
  505. if (result) {
  506. send({
  507. "type": "chat",
  508. "msg": msg,
  509. "lang": LANG
  510. });
  511. $("#chatMessage").val("")
  512. }
  513. })
  514. } else {
  515. send({
  516. "type": "chat",
  517. "msg": msg,
  518. "lang": LANG
  519. });
  520. $("#chatMessage").val("")
  521. }
  522. }
  523. return false
  524. });
  525. $(document).on("click", ".ball", function() {
  526. var rollid = $(this).data("rollid")
  527. });
  528. $(".betButton").on("click", function() {
  529. var lower = $(this).data("lower");
  530. var upper = $(this).data("upper");
  531. var amount = str2int($("#betAmount").val());
  532. if ($("#settings_dongers").is(":checked")) {
  533. amount = amount * 1000
  534. }
  535. amount = Math.floor(amount);
  536. var conf = $("#settings_confirm").is(":checked");
  537. if (conf && amount > 10000) {
  538. var pressed = false;
  539. bootbox.confirm("Are you sure you wish to bet " + formatNum(amount) + " coins?<br><br><i>You may disable this confirmation under the settings menu.</i>", function(result) {
  540. if (result && !pressed) {
  541. pressed = true;
  542. send({
  543. "type": "bet",
  544. "amount": amount,
  545. "lower": lower,
  546. "upper": upper,
  547. "round": ROUND
  548. });
  549. LAST_BET = amount;
  550. $(this).prop("disabled", true)
  551. }
  552. })
  553. } else {
  554. send({
  555. "type": "bet",
  556. "amount": amount,
  557. "lower": lower,
  558. "upper": upper,
  559. "round": ROUND
  560. });
  561. LAST_BET = amount;
  562. $(this).prop("disabled", true)
  563. }
  564. return false
  565. });
  566. $(document).on("click", ".betshort", function() {
  567. var bet_amount = str2int($("#betAmount").val());
  568. var action = $(this).data("action");
  569. if (action == "clear") {
  570. bet_amount = 0
  571. } else if (action == "double") {
  572. bet_amount *= 2
  573. } else if (action == "half") {
  574. bet_amount /= 2
  575. } else if (action == "max") {
  576. var MX = MAX_BET;
  577. if ($("#settings_dongers").is(":checked")) {
  578. MX = MAX_BET / 1000
  579. }
  580. bet_amount = Math.min(str2int($("#balance").html()), MX)
  581. } else if (action == "last") {
  582. bet_amount = LAST_BET
  583. } else {
  584. bet_amount += parseInt(action)
  585. }
  586. $("#betAmount").val(bet_amount)
  587. });
  588. $("#getbal").on("click", function() {
  589. send({
  590. "type": "balance"
  591. })
  592. });
  593. $("button.close").on("click", function() {
  594. $(this).parent().addClass("hidden")
  595. });
  596. $(document).on("contextmenu", ".chat-img", function(e) {
  597. if (e.ctrlKey) return;
  598. $("#contextMenu [data-act=1]").hide();
  599. $("#contextMenu [data-act=2]").hide();
  600. if (RANK == 100) {
  601. $("#contextMenu [data-act=1]").show();
  602. $("#contextMenu [data-act=2]").show()
  603. } else if (RANK == 1) {
  604. $("#contextMenu [data-act=1]").show()
  605. }
  606. e.preventDefault();
  607. var steamid = $(this).data("steamid");
  608. var name = $(this).data("name");
  609. $("#contextMenu [data-act=0]").html(name);
  610. var $menu = $("#contextMenu");
  611. $menu.show().css({
  612. position: "absolute",
  613. left: getMenuPosition(e.clientX, 'width', 'scrollLeft'),
  614. top: getMenuPosition(e.clientY, 'height', 'scrollTop')
  615. }).off("click").on("click", "a", function(e) {
  616. var act = $(this).data("act");
  617. e.preventDefault();
  618. $menu.hide();
  619. if (act == 0) {
  620. var curr = $("#chatMessage").val(steamid)
  621. } else if (act == 1) {
  622. var curr = $("#chatMessage").val("/mute " + steamid + " ")
  623. } else if (act == 2) {
  624. var curr = $("#chatMessage").val("/kick " + steamid + " ")
  625. } else if (act == 3) {
  626. var curr = $("#chatMessage").val("/send " + steamid + " ")
  627. } else if (act == 4) {
  628. IGNORE.push(String(steamid));
  629. chat("alert", steamid + " has been filtered.")
  630. }
  631. $("#chatMessage").focus()
  632. })
  633. });
  634. $(document).on("click", function() {
  635. $("#contextMenu").hide()
  636. });
  637. $(".side-icon").on("click", function(e) {
  638. e.preventDefault();
  639. var tab = $(this).data("tab");
  640. if ($(this).hasClass("active")) {
  641. $(".side-icon").removeClass("active");
  642. $(".tab-group").addClass("hidden");
  643. $("#mainpage").css("margin-left", "50px");
  644. $("#pullout").addClass("hidden")
  645. } else {
  646. $(".side-icon").removeClass("active");
  647. $(".tab-group").addClass("hidden");
  648. $(this).addClass("active");
  649. $("#tab" + tab).removeClass("hidden");
  650. $("#mainpage").css("margin-left", "450px");
  651. $("#pullout").removeClass("hidden");
  652. if (tab == 1) {
  653. $("#newMsg").html("")
  654. }
  655. }
  656. snapRender();
  657. return false
  658. });
  659. $(".side-icon[data-tab='1']").trigger("click")
  660. });
  661.  
  662. function getMenuPosition(mouse, direction, scrollDir) {
  663. var win = $(window)[direction](),
  664. scroll = $(window)[scrollDir](),
  665. menu = $("#contextMenu")[direction](),
  666. position = mouse + scroll;
  667. if (mouse + menu > win && menu < mouse) position -= menu;
  668. return position
  669. }
  670.  
  671. function str2int(s) {
  672. s = s.replace(/,/g, "");
  673. s = s.toLowerCase();
  674. var i = parseFloat(s);
  675. if (isNaN(i)) {
  676. return 0
  677. } else if (s.charAt(s.length - 1) == "k") {
  678. i *= 1000
  679. } else if (s.charAt(s.length - 1) == "m") {
  680. i *= 1000000
  681. } else if (s.charAt(s.length - 1) == "b") {
  682. i *= 1000000000
  683. }
  684. return i
  685. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement