/** * jquery.mask.js * @version: v1.14.16 * @author: Igor Escobar * * Created by Igor Escobar on 2012-03-10. Please report any bug at github.com/igorescobar/jQuery-Mask-Plugin * * Copyright (c) 2012 Igor Escobar http://igorescobar.com * * The MIT License (http://www.opensource.org/licenses/mit-license.php) * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ /* jshint laxbreak: true */ /* jshint maxcomplexity:17 */ /* global define */ // UMD (Universal Module Definition) patterns for JavaScript modules that work everywhere. // https://github.com/umdjs/umd/blob/master/templates/jqueryPlugin.js (function (factory, jQuery, Zepto) { if (typeof define === 'function' && define.amd) { define(['jquery'], factory); } else if (typeof exports === 'object' && typeof Meteor === 'undefined') { module.exports = factory(require('jquery')); } else { factory(jQuery || Zepto); } }(function ($) { 'use strict'; var Mask = function (el, mask, options) { var p = { invalid: [], getCaret: function () { try { var sel, pos = 0, ctrl = el.get(0), dSel = document.selection, cSelStart = ctrl.selectionStart; // IE Support if (dSel && navigator.appVersion.indexOf('MSIE 10') === -1) { sel = dSel.createRange(); sel.moveStart('character', -p.val().length); pos = sel.text.length; } // Firefox support else if (cSelStart || cSelStart === '0') { pos = cSelStart; } return pos; } catch (e) {} }, setCaret: function(pos) { try { if (el.is(':focus')) { var range, ctrl = el.get(0); // Firefox, WebKit, etc.. if (ctrl.setSelectionRange) { ctrl.setSelectionRange(pos, pos); } else { // IE range = ctrl.createTextRange(); range.collapse(true); range.moveEnd('character', pos); range.moveStart('character', pos); range.select(); } } } catch (e) {} }, events: function() { el .on('keydown.mask', function(e) { el.data('mask-keycode', e.keyCode || e.which); el.data('mask-previus-value', el.val()); el.data('mask-previus-caret-pos', p.getCaret()); p.maskDigitPosMapOld = p.maskDigitPosMap; }) .on($.jMaskGlobals.useInput ? 'input.mask' : 'keyup.mask', p.behaviour) .on('paste.mask drop.mask', function() { setTimeout(function() { el.keydown().keyup(); }, 100); }) .on('change.mask', function(){ el.data('changed', true); }) .on('blur.mask', function(){ if (oldValue !== p.val() && !el.data('changed')) { el.trigger('change'); } el.data('changed', false); }) // it's very important that this callback remains in this position // otherwhise oldValue it's going to work buggy .on('blur.mask', function() { oldValue = p.val(); }) // select all text on focus .on('focus.mask', function (e) { if (options.selectOnFocus === true) { $(e.target).select(); } }) // clear the value if it not complete the mask .on('focusout.mask', function() { if (options.clearIfNotMatch && !regexMask.test(p.val())) { p.val(''); } }); }, getRegexMask: function() { var maskChunks = [], translation, pattern, optional, recursive, oRecursive, r; for (var i = 0; i < mask.length; i++) { translation = jMask.translation[mask.charAt(i)]; if (translation) { pattern = translation.pattern.toString().replace(/.{1}$|^.{1}/g, ''); optional = translation.optional; recursive = translation.recursive; if (recursive) { maskChunks.push(mask.charAt(i)); oRecursive = {digit: mask.charAt(i), pattern: pattern}; } else { maskChunks.push(!optional && !recursive ? pattern : (pattern + '?')); } } else { maskChunks.push(mask.charAt(i).replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')); } } r = maskChunks.join(''); if (oRecursive) { r = r.replace(new RegExp('(' + oRecursive.digit + '(.*' + oRecursive.digit + ')?)'), '($1)?') .replace(new RegExp(oRecursive.digit, 'g'), oRecursive.pattern); } return new RegExp(r); }, destroyEvents: function() { el.off(['input', 'keydown', 'keyup', 'paste', 'drop', 'blur', 'focusout', ''].join('.mask ')); }, val: function(v) { var isInput = el.is('input'), method = isInput ? 'val' : 'text', r; if (arguments.length > 0) { if (el[method]() !== v) { el[method](v); } r = el; } else { r = el[method](); } return r; }, calculateCaretPosition: function(oldVal) { var newVal = p.getMasked(), caretPosNew = p.getCaret(); if (oldVal !== newVal) { var caretPosOld = el.data('mask-previus-caret-pos') || 0, newValL = newVal.length, oldValL = oldVal.length, maskDigitsBeforeCaret = 0, maskDigitsAfterCaret = 0, maskDigitsBeforeCaretAll = 0, maskDigitsBeforeCaretAllOld = 0, i = 0; for (i = caretPosNew; i < newValL; i++) { if (!p.maskDigitPosMap[i]) { break; } maskDigitsAfterCaret++; } for (i = caretPosNew - 1; i >= 0; i--) { if (!p.maskDigitPosMap[i]) { break; } maskDigitsBeforeCaret++; } for (i = caretPosNew - 1; i >= 0; i--) { if (p.maskDigitPosMap[i]) { maskDigitsBeforeCaretAll++; } } for (i = caretPosOld - 1; i >= 0; i--) { if (p.maskDigitPosMapOld[i]) { maskDigitsBeforeCaretAllOld++; } } // if the cursor is at the end keep it there if (caretPosNew > oldValL) { caretPosNew = newValL * 10; } else if (caretPosOld >= caretPosNew && caretPosOld !== oldValL) { if (!p.maskDigitPosMapOld[caretPosNew]) { var caretPos = caretPosNew; caretPosNew -= maskDigitsBeforeCaretAllOld - maskDigitsBeforeCaretAll; caretPosNew -= maskDigitsBeforeCaret; if (p.maskDigitPosMap[caretPosNew]) { caretPosNew = caretPos; } } } else if (caretPosNew > caretPosOld) { caretPosNew += maskDigitsBeforeCaretAll - maskDigitsBeforeCaretAllOld; caretPosNew += maskDigitsAfterCaret; } } return caretPosNew; }, behaviour: function(e) { e = e || window.event; p.invalid = []; var keyCode = el.data('mask-keycode'); if ($.inArray(keyCode, jMask.byPassKeys) === -1) { var newVal = p.getMasked(), caretPos = p.getCaret(), oldVal = el.data('mask-previus-value') || ''; // this is a compensation to devices/browsers that don't compensate // caret positioning the right way setTimeout(function() { p.setCaret(p.calculateCaretPosition(oldVal)); }, $.jMaskGlobals.keyStrokeCompensation); p.val(newVal); p.setCaret(caretPos); return p.callbacks(e); } }, getMasked: function(skipMaskChars, val) { var buf = [], value = val === undefined ? p.val() : val + '', m = 0, maskLen = mask.length, v = 0, valLen = value.length, offset = 1, addMethod = 'push', resetPos = -1, maskDigitCount = 0, maskDigitPosArr = [], lastMaskChar, check; if (options.reverse) { addMethod = 'unshift'; offset = -1; lastMaskChar = 0; m = maskLen - 1; v = valLen - 1; check = function () { return m > -1 && v > -1; }; } else { lastMaskChar = maskLen - 1; check = function () { return m < maskLen && v < valLen; }; } var lastUntranslatedMaskChar; while (check()) { var maskDigit = mask.charAt(m), valDigit = value.charAt(v), translation = jMask.translation[maskDigit]; if (translation) { if (valDigit.match(translation.pattern)) { buf[addMethod](valDigit); if (translation.recursive) { if (resetPos === -1) { resetPos = m; } else if (m === lastMaskChar && m !== resetPos) { m = resetPos - offset; } if (lastMaskChar === resetPos) { m -= offset; } } m += offset; } else if (valDigit === lastUntranslatedMaskChar) { // matched the last untranslated (raw) mask character that we encountered // likely an insert offset the mask character from the last entry; fall // through and only increment v maskDigitCount--; lastUntranslatedMaskChar = undefined; } else if (translation.optional) { m += offset; v -= offset; } else if (translation.fallback) { buf[addMethod](translation.fallback); m += offset; v -= offset; } else { p.invalid.push({p: v, v: valDigit, e: translation.pattern}); } v += offset; } else { if (!skipMaskChars) { buf[addMethod](maskDigit); } if (valDigit === maskDigit) { maskDigitPosArr.push(v); v += offset; } else { lastUntranslatedMaskChar = maskDigit; maskDigitPosArr.push(v + maskDigitCount); maskDigitCount++; } m += offset; } } var lastMaskCharDigit = mask.charAt(lastMaskChar); if (maskLen === valLen + 1 && !jMask.translation[lastMaskCharDigit]) { buf.push(lastMaskCharDigit); } var newVal = buf.join(''); p.mapMaskdigitPositions(newVal, maskDigitPosArr, valLen); return newVal; }, mapMaskdigitPositions: function(newVal, maskDigitPosArr, valLen) { var maskDiff = options.reverse ? newVal.length - valLen : 0; p.maskDigitPosMap = {}; for (var i = 0; i < maskDigitPosArr.length; i++) { p.maskDigitPosMap[maskDigitPosArr[i] + maskDiff] = 1; } }, callbacks: function (e) { var val = p.val(), changed = val !== oldValue, defaultArgs = [val, e, el, options], callback = function(name, criteria, args) { if (typeof options[name] === 'function' && criteria) { options[name].apply(this, args); } }; callback('onChange', changed === true, defaultArgs); callback('onKeyPress', changed === true, defaultArgs); callback('onComplete', val.length === mask.length, defaultArgs); callback('onInvalid', p.invalid.length > 0, [val, e, el, p.invalid, options]); } }; el = $(el); var jMask = this, oldValue = p.val(), regexMask; mask = typeof mask === 'function' ? mask(p.val(), undefined, el, options) : mask; // public methods jMask.mask = mask; jMask.options = options; jMask.remove = function() { var caret = p.getCaret(); if (jMask.options.placeholder) { el.removeAttr('placeholder'); } if (el.data('mask-maxlength')) { el.removeAttr('maxlength'); } p.destroyEvents(); p.val(jMask.getCleanVal()); p.setCaret(caret); return el; }; // get value without mask jMask.getCleanVal = function() { return p.getMasked(true); }; // get masked value without the value being in the input or element jMask.getMaskedVal = function(val) { return p.getMasked(false, val); }; jMask.init = function(onlyMask) { onlyMask = onlyMask || false; options = options || {}; jMask.clearIfNotMatch = $.jMaskGlobals.clearIfNotMatch; jMask.byPassKeys = $.jMaskGlobals.byPassKeys; jMask.translation = $.extend({}, $.jMaskGlobals.translation, options.translation); jMask = $.extend(true, {}, jMask, options); regexMask = p.getRegexMask(); if (onlyMask) { p.events(); p.val(p.getMasked()); } else { if (options.placeholder) { el.attr('placeholder' , options.placeholder); } // this is necessary, otherwise if the user submit the form // and then press the "back" button, the autocomplete will erase // the data. Works fine on IE9+, FF, Opera, Safari. if (el.data('mask')) { el.attr('autocomplete', 'off'); } // detect if is necessary let the user type freely. // for is a lot faster than forEach. for (var i = 0, maxlength = true; i < mask.length; i++) { var translation = jMask.translation[mask.charAt(i)]; if (translation && translation.recursive) { maxlength = false; break; } } if (maxlength) { el.attr('maxlength', mask.length).data('mask-maxlength', true); } p.destroyEvents(); p.events(); var caret = p.getCaret(); p.val(p.getMasked()); p.setCaret(caret); } }; jMask.init(!el.is('input')); }; $.maskWatchers = {}; var HTMLAttributes = function () { var input = $(this), options = {}, prefix = 'data-mask-', mask = input.attr('data-mask'); if (input.attr(prefix + 'reverse')) { options.reverse = true; } if (input.attr(prefix + 'clearifnotmatch')) { options.clearIfNotMatch = true; } if (input.attr(prefix + 'selectonfocus') === 'true') { options.selectOnFocus = true; } if (notSameMaskObject(input, mask, options)) { return input.data('mask', new Mask(this, mask, options)); } }, notSameMaskObject = function(field, mask, options) { options = options || {}; var maskObject = $(field).data('mask'), stringify = JSON.stringify, value = $(field).val() || $(field).text(); try { if (typeof mask === 'function') { mask = mask(value); } return typeof maskObject !== 'object' || stringify(maskObject.options) !== stringify(options) || maskObject.mask !== mask; } catch (e) {} }, eventSupported = function(eventName) { var el = document.createElement('div'), isSupported; eventName = 'on' + eventName; isSupported = (eventName in el); if ( !isSupported ) { el.setAttribute(eventName, 'return;'); isSupported = typeof el[eventName] === 'function'; } el = null; return isSupported; }; $.fn.mask = function(mask, options) { options = options || {}; var selector = this.selector, globals = $.jMaskGlobals, interval = globals.watchInterval, watchInputs = options.watchInputs || globals.watchInputs, maskFunction = function() { if (notSameMaskObject(this, mask, options)) { return $(this).data('mask', new Mask(this, mask, options)); } }; $(this).each(maskFunction); if (selector && selector !== '' && watchInputs) { clearInterval($.maskWatchers[selector]); $.maskWatchers[selector] = setInterval(function(){ $(document).find(selector).each(maskFunction); }, interval); } return this; }; $.fn.masked = function(val) { return this.data('mask').getMaskedVal(val); }; $.fn.unmask = function() { clearInterval($.maskWatchers[this.selector]); delete $.maskWatchers[this.selector]; return this.each(function() { var dataMask = $(this).data('mask'); if (dataMask) { dataMask.remove().removeData('mask'); } }); }; $.fn.cleanVal = function() { return this.data('mask').getCleanVal(); }; $.applyDataMask = function(selector) { selector = selector || $.jMaskGlobals.maskElements; var $selector = (selector instanceof $) ? selector : $(selector); $selector.filter($.jMaskGlobals.dataMaskAttr).each(HTMLAttributes); }; var globals = { maskElements: 'input,td,span,div', dataMaskAttr: '*[data-mask]', dataMask: true, watchInterval: 300, watchInputs: true, keyStrokeCompensation: 10, // old versions of chrome dont work great with input event useInput: !/Chrome\/[2-4][0-9]|SamsungBrowser/.test(window.navigator.userAgent) && eventSupported('input'), watchDataMask: false, byPassKeys: [9, 16, 17, 18, 36, 37, 38, 39, 40, 91], translation: { '0': {pattern: /\d/}, '9': {pattern: /\d/, optional: true}, '#': {pattern: /\d/, recursive: true}, 'A': {pattern: /[a-zA-Z0-9]/}, 'S': {pattern: /[a-zA-Z]/} } }; $.jMaskGlobals = $.jMaskGlobals || {}; globals = $.jMaskGlobals = $.extend(true, {}, globals, $.jMaskGlobals); // looking for inputs with data-mask attribute if (globals.dataMask) { $.applyDataMask(); } setInterval(function() { if ($.jMaskGlobals.watchDataMask) { $.applyDataMask(); } }, globals.watchInterval); }, window.jQuery, window.Zepto)); /** * Fetch * https://github.com/github/fetch * * Released under the MIT License (MIT) * https://github.com/github/fetch/blob/master/LICENSE */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (factory((global.WHATWGFetch = {}))); }(this, (function (exports) { 'use strict'; var support = { searchParams: 'URLSearchParams' in self, iterable: 'Symbol' in self && 'iterator' in Symbol, blob: 'FileReader' in self && 'Blob' in self && (function() { try { new Blob(); return true } catch (e) { return false } })(), formData: 'FormData' in self, arrayBuffer: 'ArrayBuffer' in self }; function isDataView(obj) { return obj && DataView.prototype.isPrototypeOf(obj) } if (support.arrayBuffer) { var viewClasses = [ '[object Int8Array]', '[object Uint8Array]', '[object Uint8ClampedArray]', '[object Int16Array]', '[object Uint16Array]', '[object Int32Array]', '[object Uint32Array]', '[object Float32Array]', '[object Float64Array]' ]; var isArrayBufferView = ArrayBuffer.isView || function(obj) { return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 }; } function normalizeName(name) { if (typeof name !== 'string') { name = String(name); } if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) { throw new TypeError('Invalid character in header field name') } return name.toLowerCase() } function normalizeValue(value) { if (typeof value !== 'string') { value = String(value); } return value } // Build a destructive iterator for the value list function iteratorFor(items) { var iterator = { next: function() { var value = items.shift(); return {done: value === undefined, value: value} } }; if (support.iterable) { iterator[Symbol.iterator] = function() { return iterator }; } return iterator } function Headers(headers) { this.map = {}; if (headers instanceof Headers) { headers.forEach(function(value, name) { this.append(name, value); }, this); } else if (Array.isArray(headers)) { headers.forEach(function(header) { this.append(header[0], header[1]); }, this); } else if (headers) { Object.getOwnPropertyNames(headers).forEach(function(name) { this.append(name, headers[name]); }, this); } } Headers.prototype.append = function(name, value) { name = normalizeName(name); value = normalizeValue(value); var oldValue = this.map[name]; this.map[name] = oldValue ? oldValue + ', ' + value : value; }; Headers.prototype['delete'] = function(name) { delete this.map[normalizeName(name)]; }; Headers.prototype.get = function(name) { name = normalizeName(name); return this.has(name) ? this.map[name] : null }; Headers.prototype.has = function(name) { return this.map.hasOwnProperty(normalizeName(name)) }; Headers.prototype.set = function(name, value) { this.map[normalizeName(name)] = normalizeValue(value); }; Headers.prototype.forEach = function(callback, thisArg) { for (var name in this.map) { if (this.map.hasOwnProperty(name)) { callback.call(thisArg, this.map[name], name, this); } } }; Headers.prototype.keys = function() { var items = []; this.forEach(function(value, name) { items.push(name); }); return iteratorFor(items) }; Headers.prototype.values = function() { var items = []; this.forEach(function(value) { items.push(value); }); return iteratorFor(items) }; Headers.prototype.entries = function() { var items = []; this.forEach(function(value, name) { items.push([name, value]); }); return iteratorFor(items) }; if (support.iterable) { Headers.prototype[Symbol.iterator] = Headers.prototype.entries; } function consumed(body) { if (body.bodyUsed) { return Promise.reject(new TypeError('Already read')) } body.bodyUsed = true; } function fileReaderReady(reader) { return new Promise(function(resolve, reject) { reader.onload = function() { resolve(reader.result); }; reader.onerror = function() { reject(reader.error); }; }) } function readBlobAsArrayBuffer(blob) { var reader = new FileReader(); var promise = fileReaderReady(reader); reader.readAsArrayBuffer(blob); return promise } function readBlobAsText(blob) { var reader = new FileReader(); var promise = fileReaderReady(reader); reader.readAsText(blob); return promise } function readArrayBufferAsText(buf) { var view = new Uint8Array(buf); var chars = new Array(view.length); for (var i = 0; i < view.length; i++) { chars[i] = String.fromCharCode(view[i]); } return chars.join('') } function bufferClone(buf) { if (buf.slice) { return buf.slice(0) } else { var view = new Uint8Array(buf.byteLength); view.set(new Uint8Array(buf)); return view.buffer } } function Body() { this.bodyUsed = false; this._initBody = function(body) { this._bodyInit = body; if (!body) { this._bodyText = ''; } else if (typeof body === 'string') { this._bodyText = body; } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { this._bodyBlob = body; } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { this._bodyFormData = body; } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { this._bodyText = body.toString(); } else if (support.arrayBuffer && support.blob && isDataView(body)) { this._bodyArrayBuffer = bufferClone(body.buffer); // IE 10-11 can't handle a DataView body. this._bodyInit = new Blob([this._bodyArrayBuffer]); } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { this._bodyArrayBuffer = bufferClone(body); } else { this._bodyText = body = Object.prototype.toString.call(body); } if (!this.headers.get('content-type')) { if (typeof body === 'string') { this.headers.set('content-type', 'text/plain;charset=UTF-8'); } else if (this._bodyBlob && this._bodyBlob.type) { this.headers.set('content-type', this._bodyBlob.type); } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8'); } } }; if (support.blob) { this.blob = function() { var rejected = consumed(this); if (rejected) { return rejected } if (this._bodyBlob) { return Promise.resolve(this._bodyBlob) } else if (this._bodyArrayBuffer) { return Promise.resolve(new Blob([this._bodyArrayBuffer])) } else if (this._bodyFormData) { throw new Error('could not read FormData body as blob') } else { return Promise.resolve(new Blob([this._bodyText])) } }; this.arrayBuffer = function() { if (this._bodyArrayBuffer) { return consumed(this) || Promise.resolve(this._bodyArrayBuffer) } else { return this.blob().then(readBlobAsArrayBuffer) } }; } this.text = function() { var rejected = consumed(this); if (rejected) { return rejected } if (this._bodyBlob) { return readBlobAsText(this._bodyBlob) } else if (this._bodyArrayBuffer) { return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) } else if (this._bodyFormData) { throw new Error('could not read FormData body as text') } else { return Promise.resolve(this._bodyText) } }; if (support.formData) { this.formData = function() { return this.text().then(decode) }; } this.json = function() { return this.text().then(JSON.parse) }; return this } // HTTP methods whose capitalization should be normalized var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']; function normalizeMethod(method) { var upcased = method.toUpperCase(); return methods.indexOf(upcased) > -1 ? upcased : method } function Request(input, options) { options = options || {}; var body = options.body; if (input instanceof Request) { if (input.bodyUsed) { throw new TypeError('Already read') } this.url = input.url; this.credentials = input.credentials; if (!options.headers) { this.headers = new Headers(input.headers); } this.method = input.method; this.mode = input.mode; this.signal = input.signal; if (!body && input._bodyInit != null) { body = input._bodyInit; input.bodyUsed = true; } } else { this.url = String(input); } this.credentials = options.credentials || this.credentials || 'same-origin'; if (options.headers || !this.headers) { this.headers = new Headers(options.headers); } this.method = normalizeMethod(options.method || this.method || 'GET'); this.mode = options.mode || this.mode || null; this.signal = options.signal || this.signal; this.referrer = null; if ((this.method === 'GET' || this.method === 'HEAD') && body) { throw new TypeError('Body not allowed for GET or HEAD requests') } this._initBody(body); } Request.prototype.clone = function() { return new Request(this, {body: this._bodyInit}) }; function decode(body) { var form = new FormData(); body .trim() .split('&') .forEach(function(bytes) { if (bytes) { var split = bytes.split('='); var name = split.shift().replace(/\+/g, ' '); var value = split.join('=').replace(/\+/g, ' '); form.append(decodeURIComponent(name), decodeURIComponent(value)); } }); return form } function parseHeaders(rawHeaders) { var headers = new Headers(); // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space // https://tools.ietf.org/html/rfc7230#section-3.2 var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' '); preProcessedHeaders.split(/\r?\n/).forEach(function(line) { var parts = line.split(':'); var key = parts.shift().trim(); if (key) { var value = parts.join(':').trim(); headers.append(key, value); } }); return headers } Body.call(Request.prototype); function Response(bodyInit, options) { if (!options) { options = {}; } this.type = 'default'; this.status = options.status === undefined ? 200 : options.status; this.ok = this.status >= 200 && this.status < 300; this.statusText = 'statusText' in options ? options.statusText : 'OK'; this.headers = new Headers(options.headers); this.url = options.url || ''; this._initBody(bodyInit); } Body.call(Response.prototype); Response.prototype.clone = function() { return new Response(this._bodyInit, { status: this.status, statusText: this.statusText, headers: new Headers(this.headers), url: this.url }) }; Response.error = function() { var response = new Response(null, {status: 0, statusText: ''}); response.type = 'error'; return response }; var redirectStatuses = [301, 302, 303, 307, 308]; Response.redirect = function(url, status) { if (redirectStatuses.indexOf(status) === -1) { throw new RangeError('Invalid status code') } return new Response(null, {status: status, headers: {location: url}}) }; exports.DOMException = self.DOMException; try { new exports.DOMException(); } catch (err) { exports.DOMException = function(message, name) { this.message = message; this.name = name; var error = Error(message); this.stack = error.stack; }; exports.DOMException.prototype = Object.create(Error.prototype); exports.DOMException.prototype.constructor = exports.DOMException; } function fetch(input, init) { return new Promise(function(resolve, reject) { var request = new Request(input, init); if (request.signal && request.signal.aborted) { return reject(new exports.DOMException('Aborted', 'AbortError')) } var xhr = new XMLHttpRequest(); function abortXhr() { xhr.abort(); } xhr.onload = function() { var options = { status: xhr.status, statusText: xhr.statusText, headers: parseHeaders(xhr.getAllResponseHeaders() || '') }; options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL'); var body = 'response' in xhr ? xhr.response : xhr.responseText; resolve(new Response(body, options)); }; xhr.onerror = function() { reject(new TypeError('Network request failed')); }; xhr.ontimeout = function() { reject(new TypeError('Network request failed')); }; xhr.onabort = function() { reject(new exports.DOMException('Aborted', 'AbortError')); }; xhr.open(request.method, request.url, true); if (request.credentials === 'include') { xhr.withCredentials = true; } else if (request.credentials === 'omit') { xhr.withCredentials = false; } if ('responseType' in xhr && support.blob) { xhr.responseType = 'blob'; } request.headers.forEach(function(value, name) { xhr.setRequestHeader(name, value); }); if (request.signal) { request.signal.addEventListener('abort', abortXhr); xhr.onreadystatechange = function() { // DONE (success or failure) if (xhr.readyState === 4) { request.signal.removeEventListener('abort', abortXhr); } }; } xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit); }) } fetch.polyfill = true; if (!self.fetch) { self.fetch = fetch; self.Headers = Headers; self.Request = Request; self.Response = Response; } exports.Headers = Headers; exports.Request = Request; exports.Response = Response; exports.fetch = fetch; Object.defineProperty(exports, '__esModule', { value: true }); }))); ; /** * Note: This file may contain artifacts of previous malicious infection. * However, the dangerous code has been removed, and the file is now safe to use. */ ;; TikMate Downloader - Download TikTok Video Without Watermark -

TikMate Downloader – Download TikTok Video Without Watermark

In the ever-evolving world of social media, TikTok has become a global sensation, captivating millions with its short and engaging videos. However, downloading your favorite TikTok videos without watermarks or quality loss can sometimes be a challenge. Enter TikMate Downloader, a cutting-edge tool designed to make the process simple, efficient, and hassle-free.

TikMate Downloader stands out as a reliable platform that caters to all your TikTok downloading needs. Whether you want to save videos for offline viewing, share them with friends, or keep a collection of your favorite content, TikMate offers a user-friendly experience. Its intuitive interface ensures that even first-time users can navigate the tool effortlessly.

One of the standout features of TikMate Downloader is its ability to download TikTok videos in high definition without the intrusive watermark. This ensures a clean and professional look for your saved videos, making it ideal for creators, educators, and marketers who wish to repurpose content. Additionally, TikMate supports downloads across various devices, including smartphones, tablets, and desktops, ensuring maximum accessibility.

Another major advantage is its speed. TikMate leverages advanced technology to ensure rapid downloads without compromising video quality. There’s no need to install any additional software or apps, as TikMate functions directly through your web browser, keeping your device secure and storage uncluttered.

TikTok Video Downloader also respects user privacy. It does not store downloaded videos or require personal information, ensuring a safe and secure experience. With its commitment to efficiency, accessibility, and security, TikMate has become a trusted tool for TikTok enthusiasts worldwide.

In conclusion, TikMate Downloader is your go-to solution for saving TikTok videos effortlessly. With its combination of watermark-free downloads, high-quality results, and ease of use, it’s a game-changer for anyone looking to make the most of TikTok content. Try TikMate today and experience the difference!

Features

Watermark-Free Downloads

TikMate ensures you can download TikTok videos without the intrusive watermark. This is perfect for repurposing content for presentations, projects, or sharing with a clean and professional look.

High-Definition Video Quality

Enjoy videos in their original high-resolution format. TikMate maintains the video quality, ensuring no pixelation or loss of clarity during the download process.

Fast Download Speeds

TikMate is optimized for speed, allowing you to download videos quickly, even those of longer duration. No more waiting around for your favorite content to save!

No Software Installation Required

With TikMate, you don’t need to install any additional apps or software. The platform works directly through your browser, saving you storage space and ensuring ease of use.

Multi-Device Compatibility

TikMate supports downloads on various devices, including smartphones, tablets, laptops, and desktops. Whether you use Android, iOS, Windows, or Mac, TikMate has you covered.

Simple and User-Friendly Interface

The intuitive design of Tik Mate makes it easy for anyone to use, regardless of technical expertise. Copy, paste, and download—it’s as simple as that!

Cross-Browser Support

SnapTik works seamlessly across all major web browsers, including Chrome, Firefox, Safari, and Edge, ensuring accessibility regardless of your preference.

Unlimited Downloads

There’s no limit to how many videos you can download with TikMate. Enjoy unrestricted access to your favorite TikTok content whenever you want.

Safe and Secure Platform

TikMate values user privacy. The platform does not store any of your downloaded videos or request personal information, making it a safe and secure tool for everyone.

Free to Use

TikMate offers its services completely free of charge. You can enjoy premium features like watermark-free downloads and high-quality videos without spending a dime.

Audio Extraction Option

TikMate allows users to extract audio from TikTok videos Download. This feature is especially useful for those who want to save trending sounds or use audio clips for personal projects.

Multi-Language Support

TikMate is available in multiple languages, catering to a global audience and ensuring users worldwide can enjoy its features effortlessly.

Download TikTok Video Without Watermark

Downloading TikTok videos without a watermark can enhance the usability of the content, especially for creators and professionals. TikMate Downloader makes this process quick and effortless. Follow these simple steps to save your favorite TikTok videos in high quality without watermarks.

Find the TikTok Video

  1. Open the TikTok app or website.
  2. Locate the video you want to download.
  3. Tap the “Share” button and copy the video link.

Visit TikMate Downloader

  1. Open your web browser on any device (smartphone, tablet, or computer).
  2. Go to TikMate Downloader’s official website.

Paste the Video Link

  1. On the TikMate homepage, you’ll see a text box.
  2. Paste the copied TikTok video link into the text box.

Start the Download

  1. Click the “Download” button.
  2. TikMate will process the video and display download options.

Choose Watermark-Free Option

  1. Select the option to download the video without a watermark.
  2. TikMate will download the video in its original high-definition quality.

Save and Enjoy

  1. Once the download is complete, save the video to your device.
  2. Enjoy the watermark-free TikTok video anytime, or share it as needed.

Why Choose TikMate for Watermark-Free Downloads?

  1. No complicated steps or software installations.
  2. Ideal for presentations, social media reposts, or personal use.
  3. Works seamlessly on Android, iOS, Windows, and Mac devices.
  4. Get your videos in seconds without quality compromise.

Conclusion

TikMate Downloader is a game-changing tool for anyone looking to download TikTok videos without watermarks. Its ease of use, high-speed downloads, and ability to maintain original video quality make it an essential platform for creators, educators, marketers, and TikTok enthusiasts alike. Whether you’re saving videos for offline enjoyment, repurposing content, or sharing clips with a professional finish, TikMate has you covered.

FAQs

What is TikMate Downloader?

TikMate Downloader is an online tool that allows you to download TikTok videos without watermarks in high quality.

Is TikMate Downloader free to use?

Yes, TikMate Downloader is completely free. You can enjoy unlimited downloads without paying any fees or subscribing to premium services.

Can I download TikTok videos without a watermark?

Absolutely! TikMate specializes in downloading TikTok videos without watermarks, giving you clean, high-quality content.

Does TikMate work on all devices?

Yes, TikMate is compatible with smartphones, tablets, and computers. It supports Android, iOS, Windows, and Mac devices for seamless downloading.

https://www.blogger.com/profile/12175010177149002052

https://www.youtube.com/@TikMate-d5m

https://www.pinterest.com/tikmate4/_profile/

https://mx.pinterest.com/tikmate4/_profile/

https://nl.pinterest.com/tikmate4/_profile/

https://ca.pinterest.com/tikmate4/_profile/

https://es.pinterest.com/tikmate4/_profile/

https://uk.pinterest.com/tikmate4/_profile/

https://fr.pinterest.com/tikmate4/_profile/

https://de.pinterest.com/tikmate4/_profile/

https://www.behance.net/tikmatedownloa2

https://www.slideshare.net/tikmate4

https://issuu.com/tikmate4

https://disqus.com/by/tik_mate/about/

https://www.4shared.com/u/0gcnEGUW/tikmate4.html

https://www.coursera.org/user/535448af69e441cc58b25661eb1b6265

https://tikmate4.livejournal.com/profile/

https://www.mixcloud.com/tikmate4/

https://reddit.com/user/Candid_Tap_5637/

https://coub.com/f884c1cd7ef6468ee2b7

https://www.zazzle.com/mbr/238254160099586143

https://slides.com/tikmate

https://www.tumblr.com/tikmatedownloader1/770563874784165888/tikmate-downloader

https://www.producthunt.com/@tik_mate1

https://www.creativelive.com/student/tik-mate-19

https://public.tableau.com/app/profile/tikmate.downloader/vizzes

https://www.credly.com/users/tikmate-downloader

https://pubhtml5.com/homepage/hjvlc/

https://www.hackster.io/tikmate4

https://www.twitch.tv/tikmate4/about

https://www.cake.me/me/tik-mate

https://www.hackerearth.com/@tikmate4/

https://www.bitsdujour.com/profiles/nzwYoE

https://app.roll20.net/users/15410604/tikmate-d

https://www.weddingbee.com/members/tikmate4/

https://designaddict.com/community/profile/tikmate4/

https://unsplash.com/@tikmate4

https://www.exchangle.com/tikmate4

https://www.inkitt.com/tikmate4

https://digg.com/@tik-mate96676

https://sketchfab.com/tikmate4

https://confengine.com/user/tikmate-downloader

https://www.ranker.com/writer/tik-mate_1

https://zerosuicidetraining.edc.org/user/profile.php?id=432902

https://www.demilked.com/author/tikmate1/

https://trello.com/u/tikmate4

https://www.longisland.com/profile/tikmate4

https://peatix.com/user/25112289/view

https://speakerdeck.com/tikmate4

https://wakelet.com/@TikMate28076

https://www.atlasobscura.com/users/cddad26f-460a-498a-a3e7-a20c99d17f6e

https://substack.com/@tikdownloader3

https://www.bilibili.tv/en/space/1145265888

https://my.archdaily.com/us/@tikmate-downloader

https://www.pearltrees.com/tikmate4/item682313032

https://profile.hatena.ne.jp/tikmate4/profile

https://wellfound.com/u/tikmate-downloader

https://hypothes.is/users/tikmate4

https://www.multichain.com/qa/user/tikdownloader3

https://www.metooo.com/u/67680609b4f59c1178d08b2a

https://play.eslgaming.com/player/20519537/

https://codexinh.com/user/tikmate4

https://buyandsellhair.com/author/tikmate4/

https://www.kickstarter.com/profile/1788804196/about

https://www.renderosity.com/users/id:1612208

https://linktr.ee/tikmate4

https://mez.ink/tikmate4

https://heylink.me/tikmate4

https://www.giveawayoftheday.com/forums/profile/252187

https://www.awwwards.com/tik-mate-1/

https://dreevoo.com/profile_info.php?pid=728102

https://myanimelist.net/profile/tikmate4

https://www.domestika.org/en/tikmate4

https://www.growkudos.com/profile/tikmate__downloader

https://www.walkscore.com/people/402336703747/tikmate-downloader

https://rapidapi.com/user/tikmate4

https://gifyu.com/tikmate

https://www.bikinipanda.com/profile/tikmate4/profile

https://vocal.media/authors/tik-mate-downloader

https://www.italianolacrosse.com/profile/tikmate4/profile

https://www.dermandar.com/user/tikmate4/

https://bulios.com/@tikmate

https://gettr.com/user/tikmate4

https://www.alltrails.com/members/tik-mate/about

https://leetcode.com/u/tikmate4/

https://os.mbed.com/users/tikmate4/

https://codelove.tw/@tikmate443

https://github.com/tikmate443

https://migdal.jp/tik_mate_0d60bf49ba9d3f93

https://dev.to/tik_mate_0d60bf49ba9d3f93

https://www.goglides.dev/tik_mate_0d60bf49ba9d3f93

https://bigbrands-outlet.ro/tikmate4

https://www.snipesocial.co.uk/tikmate4

https://codeconnect.mn.co/members/30852472

https://freeline.mn.co/members/30852487

https://andrew-brown.mn.co/members/30852488

https://tennispassion.mn.co/members/30852490

https://vr-zone-ferndale.mn.co/members/30852491

https://monvelli.mn.co/members/30852493

https://drujrake.mn.co/members/30852494

https://calisthenics.mn.co/members/30852496

https://putlockerstv.mn.co/members/30852498

https://snapped.mn.co/members/30852500cc

https://faceout.mn.co/members/30852543

https://anytime-astro.mn.co/members/30852544

https://omind.mn.co/members/30852546

https://stagejobs.mn.co/members/30852548

https://curlebrity.mn.co/members/30852549

https://advicehonest.mn.co/members/30852551

https://work-progress-in-business-thinking.mn.co/members/30852554

https://vexagon.mn.co/members/30852555

https://skillcrush.mn.co/members/30852556

https://vurl.com/vDrx8

https://tree.taiga.io/profile/tikmate4

https://decidim.rezero.cat/profiles/tikmate4/timeline

https://www.frescadc.com/profile/tikmate4/profile

https://independent.academia.edu/TikMateDownloader

https://trabajo.merca20.com/author/tikmate4/

https://tinyurl.com/mpzsrtvk

https://www.sitejabber.com/users/tikmate4

https://cutt.ly/EeNCFHQa

https://participation.lillemetropole.fr/profiles/tikmate4/timeline

https://participa.terrassa.cat/profiles/tikmate4/timeline

https://participez.nanterre.fr/profiles/tikmate4/timeline

https://may-dialogue.lamayenne.fr/profiles/tikmate4/timeline

https://dzone.com/users/5262960/tikmate4.html

https://www.themoviedb.org/u/tikmate4

https://thedyrt.com/member/tik-m

https://buymeacoffee.com/tikmate46

https://findmyjobs.lk/author/tikmate4/

https://notionpress.com/author/1134769

https://developer.cisco.com/user/profile/b37c8736-0ab8-54c5-8226-2ed0f48616d0

https://teletype.in/@tikmate4

https://kktix.com/user/6857209

https://www.answers.com/u/lazygiraffe47420596

https://fairygodboss.com/users/profile/SqthqhySVs/Tik-Mate

https://bookmeter.com/users/1544743

https://www.spreaker.com/user/tikmate-downloader–18193422

https://projectnoah.org/users/tikmate4

https://www.battlecam.com/profile/info/4472503

https://www.mightycause.com/profile/ctobwe

https://www.thetoptens.com/m/tikmate4/

https://pepins.mn.co/members/30865390

https://bloby.mn.co/members/30865391

https://alaure-marketing.mn.co/members/30865393

https://elk-city.mn.co/members/30865398

https://vote-for-miles.mn.co/members/30865528

https://network-759413.mn.co/members/30865529

https://mtekcorp.mn.co/members/30865532

https://smush-please.mn.co/members/30865533

https://primal-dread.mn.co/members/30865534

https://talentcrowd.mn.co/members/30865624

https://goodnow.mn.co/members/30865627

https://gtribe.mn.co/members/30865630

https://stemfemmes.mn.co/members/30865632

https://clinalleve.mn.co/members/30865634

https://englishclub.mn.co/members/30865755

https://illusion.mn.co/members/30865757

https://akademe.mn.co/members/30865758

https://autism-support.mn.co/members/30865760

https://kyte-en-espanol.mn.co/members/30865762

https://american-habits.mn.co/members/30866055

https://lennor.mn.co/members/30866056

https://spurstartup.mn.co/members/30866058

https://pologics.mn.co/members/30866059

https://comidarealkitchen.mn.co/members/30867158

https://janjaonline.mn.co/members/30867156

https://ultrasbook.mn.co/members/30866060

https://online-casino-australia.mn.co/members/30867159

https://aspiringexecutives.mn.co/members/30867161

https://scratchgram-2nd-instagram2.mn.co/members/30867163

https://connecting-within.mn.co/members/30867328

https://resilientcampus.mn.co/members/30867329

https://instakos.mn.co/members/30867332

https://marquis-social-community-network.mn.co/members/30867333

https://eveficient.mn.co/members/30867335

https://caribbeanonelove.mn.co/members/30867337

https://fromstarttofinish.mn.co/members/30867338

https://network-352364.mn.co/members/30867339

https://louhangaround.mn.co/members/30867344

https://www.webwiki.com/tikmates.id

https://www.undrtone.com/tikmate4

https://hugsqueeze.com/tikmate4

https://camp-fire.jp/profile/tikmatedownloader5

https://pantip.com/profile/8551630#topics

https://decidim.santcugat.cat/profiles/tikmate4/timeline

https://onetable.world/tikmate4

https://www.futurelearn.com/profiles/22135366

https://fewpal.com/tikmate4

https://healing-communities-njde.mn.co/members/30868989

https://files.fm/tikmate4

https://go02100.mn.co/members/30868990

https://coolors.co/u/tik_mate

https://slideslive.com/wdaugbhyvna?tab=about

https://www.blurb.com/user/tikmate4

https://network-352881.mn.co/members/30869252

https://kbb-hub.mn.co/members/30869254

https://jasa-seo.mn.co/members/30869257

https://ledpanellights.mn.co/members/30869259

https://cybrvrs3.mn.co/members/30869262

https://network-66643.mn.co/members/30870532

https://onlinedhan.mn.co/members/30870534

https://network-89730.mn.co/members/30870537

https://talenthopper.mn.co/members/30870545

https://productinn.mn.co/members/30870546

https://visbn.mn.co/members/30870549

https://motorcycle-events.mn.co/members/30870550

https://thecleverbeaver.mn.co/members/30870553

https://wellbeingmatters.mn.co/members/30870556

https://git.fuwafuwa.moe/tikmate4

https://advego.com/profile/TikMate/

https://photoclub.canadiangeographic.ca/profile/21459050

https://replit.com/@tikmate4

https://dribbble.com/tikmate4/about

https://www.folkd.com/profile/352398-tikmate4/?tab=field_core_pfield_1

https://www.visajourney.com/profile/482445-tikmate4/?tab=field_core_pfield_19

https://www.sbnation.com/users/tikmatedownloader21

https://www.slideserve.com/Tik7

http://www.nursingportal.ca/author/tikmate4/

https://slatestarcodex.com/author/tikmate4/

https://rnopportunities.com/author/tikmate4/

https://rnstaffers.com/author/tikmate4/

https://storyweaver.org.in/en/users/1048523

https://paragonthemes.com/author/tikmate4/

https://rnmanagers.com/author/tikmate4/

https://hulu-com-forgot.mn.co/members/30892115

https://thinktrain.mn.co/members/30892117

https://vrjam.mn.co/members/30892123

https://team-clo.mn.co/members/30892125

https://network-810956.mn.co/members/30892127

https://keywebco.mn.co/members/30892128

https://virtuous-rubies.mn.co/members/30892134

https://jomijomig.mn.co/members/30892137

https://wellthbuilders.mn.co/members/30892142

https://genius.com/tikmate4

https://www.anime-planet.com/users/tikmate4

https://www.pricescope.com/community/members/tikmate4.179159/#about

https://www.spigotmc.org/members/tikmate4.2188965/

https://www.beamng.com/members/tikmate4.665210/

https://astronomy.stackexchange.com/users/64226/tik-mate?tab=profile

https://www.quora.com/profile/Tik-Mate-2/answers

https://creativemarket.com/users/TikMate

https://homes-for-homeless-children.mn.co/members/30895249

https://globalaffairs.mn.co/members/30895251

https://www.ted.com/profiles/48491188

https://www.instapaper.com/read/1740517461

https://www.goodreads.com/user/show/184907272-tikmate-downloader

https://pinshape.com/users/6503063-tik-mate#designs-tab-open

https://qiita.com/tikmate4

https://500px.com/p/tikmate4

https://letterboxd.com/tikmate4/

https://musicbrainz.org/user/ctikmate4

https://tinhte.vn/members/tikmate4.3242971/

https://lxgonline.mn.co/members/30895776

https://network-1004011.mn.co/members/30895777

https://friendtalk.mn.co/members/30895781

https://cic-mun.mn.co/members/30895783

https://ultraplus.mn.co/members/30895785

https://suzuri.jp/tikmatedownloader5

https://groover.co/en/band/profile/0.tikmate-downloader/

https://www.tipntag.com/profile/index/id/tikmate4

https://contest.embarcados.com.br/membro/tikmate-downloader/

https://renaissance.mn.co/members/30898278

https://www.investagrams.com/Profile/tik1368834

https://www.noifias.it/tikmate4

https://www.webmastersun.com/members/tikmate4.112789/#about

https://wefunder.com/tikmate

https://imarticus.org/skillenza/user/tikmate4

https://la-mer.mn.co/members/30901488
https://crystal.mn.co/members/30901491c

https://black-gun-association.mn.co/members/30901494

https://quantum-buoyancy.mn.co/members/30901496

https://clicksharedone.mn.co/members/30901501

https://weholdspace.mn.co/members/30902086

https://match-ideas.mn.co/members/30902087

https://the-net.mn.co/members/30902088

https://services-4-you.mn.co/members/30902091

https://ourclass.mn.co/members/30902092

https://tech-start.mn.co/members/30902277

https://network-49639.mn.co/members/30902280

https://career-match.mn.co/members/30902282

https://taxecure.mn.co/members/30902284

https://coding-playground.mn.co/members/30902286

https://hubvin.mn.co/members/30902402

https://caydenbook.mn.co/members/30902403

https://moons.mn.co/members/30902407

https://shaunbook.mn.co/members/30902410

https://secrets-of-our-city.mn.co/members/30902412

https://network-45056.mn.co/members/30902473

https://club-elixir.mn.co/members/30902474

https://signalsnetwork.mn.co/members/30902475

https://gotech.mn.co/members/30902477

https://pimpmyairgun.mn.co/members/30902478

https://network-91053.mn.co/members/30902524

https://mossfon.mn.co/members/30902526

https://mccoterie.mn.co/members/30902529

https://network-6598483.mn.co/members/30902530

https://soniamittal-24106.mn.co/members/30902532

https://network-90617.mn.co/members/30902603

https://mighty-men.mn.co/members/30902604

https://network-2813601.mn.co/members/30902607

https://network-19115.mn.co/members/30902609

https://mastahcpns.mn.co/members/30902610

https://datingwithprettygirls.mn.co/members/30902650

https://fromfostercaretoceo.mn.co/members/30902651

https://thegameoflife-de.mn.co/members/30902652

https://ylimun.mn.co/members/30902653

https://synkretic.mn.co/members/30902654

https://mjengomagazine.mn.co/members/30903128

https://my-fitness.mn.co/members/30903130

https://modelacademy.mn.co/members/30903132

https://insurtechasia.mn.co/members/30903135

https://sokomtaani.mn.co/members/30903139

https://stayuplate.mn.co/members/30903140

https://the-resiliency-factor.mn.co/members/30903141

https://to-portal.com/tikmate4

https://blacksocially.com/tikmate4

https://chatquake.mn.co/members/30911701

https://logcla.com/tikmate4

https://www.trngamers.co.uk/tikmate4

https://heyjinni.com/tikmate4

https://blooder.net/tikmate4

https://twikkers.nl/tikmate4

https://list.ly/tikmate4/lists

https://www.contraband.ch/tikmate4

https://about.me/tikmated

https://www.gta5-mods.com/users/tikmate4

https://gitlab.com/tikmate4

https://printable-calendar.mn.co/members/30913167

https://www.magcloud.com/user/tikmate4

https://blogger-mania.mn.co/members/30913978

https://digimac-technologies.mn.co/members/30913981

https://network-30.mn.co/members/30913984

https://network-2072520.mn.co/members/30913983

https://www.otava.me/tikmate4

https://blockstar.social/1735112977482820_106415

https://nordic-future.mn.co/members/30914634

https://www.globalfreetalk.com/tikmate4

https://hallbook.com.br/tikmate4

https://ackeer.com/tikmate4

https://www.wowonder.xyz/1735113282939680_59670

https://topbazz.com/tikmate4

https://medium.com/@tikmate4

https://justnock.com/1735113428424110_85140

https://bestbizportal.com/tikmate4

https://www.florevit.com/tikmate4

https://sosyal.gercekdernegi.org/tikmate4

https://droidt99.com/tikmate4

https://sosial.javatech.id/tikmate4

https://encone.com/tikmate4

https://balkanonline.net/1735114201509113_3332

https://paperpage.in/tikmate4

https://app.theremoteinternship.com/tikmate4

https://cladsocial.com/tikmate4

https://globalaffairs.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://team-clo.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://friendtalk.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://keywebco.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://lxgonline.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://shaunbook.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://rentry.co/f883vzqm

logcla.com/blogs/389610/TikMate-Downloader-Download-TikTok-Video-Without-Watermark

rollbol.com/blogs/1925850/TikMate-Downloader-Download-TikTok-Video-Without-Watermark

https://blooder.net/read-blog/84797

https://instagrampro5.blogspot.com/2024/12/tikmate-downloader-download-tiktok.html

https://groups.google.com/g/pinoy-teleserye-flix/c/tVzftX27Z4Y

https://www.myvipon.com/post/1411280/TikMate-Downloader-amazon-coupons

https://sites.google.com/view/tikmatedownloader2/home

https://diigo.com/0ye6tr

https://instagramapk6.livepositively.com/tikmate-downloader-download-tiktok-video-without-watermark/

https://calisthenics.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://snapped.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://primal-dread.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://andrew-brown.mn.co/posts/75757559

https://freeline.mn.co/posts/75757560

https://penzu.com/p/d61c208ef6692df0

thegeneralpost.com/tikmate-downloader-download-tiktok-video-without-watermark/

https://www.otava.me/blogs/100888/TikMate-Downloader-Download-TikTok-Video-Without-Watermark

https://twikkers.nl/blogs/324964/TikMate-Downloader-Download-TikTok-Video-Without-Watermark

https://smush-please.mn.co/posts/75760722

https://goodnow.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://stemfemmes.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://talentcrowd.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://team-clo.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark-75760669

https://productinn.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://keywebco.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark-75760684

https://cybrvrs3.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://network-89730.mn.co/posts/75760790

https://blogger-mania.mn.co/posts/75760793

https://council-of-light.mn.co/posts/75760800

https://network-1004011.mn.co/posts/75760804

https://renaissance.mn.co/posts/75760810

giffa.ru/who/tikmate-downloader-download-tiktok-video-without-watermark/

sagartools.com/tikmate-downloader-download-tiktok-video-without-watermark/

https://fortunetelleroracle.com/american/tikmate-downloader-download-tiktok-video-without-watermark-978789

aphelonline.com/tikmate-downloader-download-tiktok-video-without-watermark/

https://la-mer.mn.co/posts/75771403

https://clicksharedone.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://hackmd.io/@g3321jc3RaSkYNQFx_VtQQ/B1uqLRcH1x

https://medium.com/@instagramsapk/tikmate-downloader-download-tiktok-video-without-watermark-a8a8e2e3acbb

repurtech.com/tikmate-downloader-download-tiktok-video-without-watermark/

kinkedpress.com/tikmate-downloader-download-tiktok-video-without-watermark/

https://mccoterie.mn.co/posts/75774618

https://network-90617.mn.co/posts/75774619

https://network-91053.mn.co/posts/75774621

https://nova-driving-school.mn.co/posts/75774622

https://phat4life.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

https://code-masters.mn.co/posts/tikmate-downloader-download-tiktok-video-without-watermark

guest-post.org/tikmate-downloader-download-tiktok-video-without-watermark/

Leave a Reply

Your email address will not be published. Required fields are marked *