substitute.html revision 58ec2c19476c8981b1c3280d3bbcce8a11acc578
58ec2c19476c8981b1c3280d3bbcce8a11acc578Luke Smith<!doctype html>
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore<html>
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore<head>
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore<title>YUI substitute Tests</title>
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore</head>
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
9982ae2753aea312f8260f66903f5cfb1d202d22Adam Moore<body class="yui3-skin-sam">
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore<h1>substitute Tests</h1>
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore<p><input type="button" value="Run Tests" id="btnRun" disabled="true" /></p>
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore<script type="text/javascript" src="/build/yui/yui.js"></script>
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore<script type="text/javascript">
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore(function() {
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore YUI({
58ec2c19476c8981b1c3280d3bbcce8a11acc578Luke Smith filter: (window.location.search.match(/[?&]filter=([^&]+)/) || [])[1] || 'min',
58ec2c19476c8981b1c3280d3bbcce8a11acc578Luke Smith allowRollup: false,
58ec2c19476c8981b1c3280d3bbcce8a11acc578Luke Smith useBrowserConsole: false
58ec2c19476c8981b1c3280d3bbcce8a11acc578Luke Smith }).use("dump", "test", "console", "event-custom", function(Y) {
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
9982ae2753aea312f8260f66903f5cfb1d202d22Adam Moore var button = Y.one('#btnRun'),
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Assert = Y.Assert,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore ObjectAssert = Y.ObjectAssert;
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore // Set up the page
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore button.set("disabled", false);
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Y.on("click", function() {
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Y.Test.Runner.run();
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore }, button);
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
9982ae2753aea312f8260f66903f5cfb1d202d22Adam Moore var myConsole = new Y.Console().render();
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore var testSubstitute= new Y.Test.Case({
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore name: "Substitute tests",
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore test_substitute: function() {
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore ////////////////////////////////////////////////////////////////////////////////
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore var param = {domain: 'valvion.com',
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore media: 'http://media.{domain}/', /* nested */
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore contextdomain: { context1: 'context{domain}', context2: 'yahoo.com' }, /* the value is an object, we will use a custom function to extract the correct data */
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore contextmedia: 'http://contextmedia.{contextdomain context1}/'};
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore var url;
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore // standard replace, nested
838d626f7e69c325fea41507371d80369a69026cAdam Moore url = Y.substitute("{media}logo.gif", param, null, true);
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Assert.areEqual(url, "http://media.valvion.com/logo.gif");
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore // If the replacement value is an object, use the meta info as a key to extract the
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore // correct data. Otherwise just return the value.
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore function multipleChoice(key, val, meta) {
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore return (Y.Lang.isObject(val)) ? val[meta] : val;
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore }
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore // "random data" is not used since the value for the contextmedia key is a string.
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore // contextdomain uses "context1" as a key to expand the string correctly
838d626f7e69c325fea41507371d80369a69026cAdam Moore url = Y.substitute("{contextmedia random data}logo.gif", param, multipleChoice, true);
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Assert.areEqual(url, "http://contextmedia.contextvalvion.com/logo.gif");
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore ////////////////////////////////////////////////////////////////////////////////
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore var obj = {
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level1_1: 1.1,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level1_2: 1.2,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level1_3: {
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level2_1: 2.1,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level2_2: 2.2,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level2_3: {
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level3_1: 3.1,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level3_2: 3.2,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level3_3: 3.3,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level3_4: 3.4
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore },
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level2_4: 2.4
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore },
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level1_4: 1.4
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore };
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Assert.areEqual(
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro Y.substitute("{testobj 0}", { testobj: obj }, null, true),
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore "{level1_1 => 1.1, level1_2 => 1.2, level1_3 => {...}, level1_4 => 1.4}",
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore "failed one level object dump"
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore );
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Assert.areEqual(
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro Y.substitute("{testobj 1}", { testobj: obj }, null, true),
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore "{level1_1 => 1.1, level1_2 => 1.2, level1_3 => {level2_1 => 2.1, level2_2 => 2.2, level2_3 => {...}, level2_4 => 2.4}, level1_4 => 1.4}",
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore "failed two level object dump"
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore );
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Assert.areEqual(
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Y.substitute(
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro "{testobj 10}", { testobj: obj }, null, true),
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore "{level1_1 => 1.1, level1_2 => 1.2, level1_3 => {level2_1 => 2.1, level2_2 => 2.2, level2_3 => {level3_1 => 3.1, level3_2 => 3.2, level3_3 => 3.3, level3_4 => 3.4}, level2_4 => 2.4}, level1_4 => 1.4}",
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore "failed deep object dump"
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore );
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore var arr = [
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 1.1,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 1.2,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore [
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 2.1,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 2.2,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore [
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 3.1,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 3.2,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 3.3,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 3.4
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore ],
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 2.4
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore ],
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 1.4
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore ];
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Assert.areEqual(
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore Y.substitute("{testarr 1}", { testarr: arr }, null, true),
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore "[1.1, 1.2, [2.1, 2.2, {...}, 2.4], 1.4]",
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore "failed two level array dump"
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore );
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore var mix = [
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 1.1,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore new Date(),
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore {
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level2_1: 2.1,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level2_2: 2.2,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level2_3: [
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 3.1,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 3.2,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 3.3,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 3.4
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore ],
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore level2_4: 2.4
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore },
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore 1.4,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore function(){}
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore ];
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
838d626f7e69c325fea41507371d80369a69026cAdam Moore var result = Y.substitute("{testmix 1}", { testmix: mix }, null, true);
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Assert.isTrue(
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore (result.indexOf("GMT" > -1)) ? true : false,
583b6463b1b1af52ed4ff0bfa66a6fbf8658c5b3Adam Moore "failed two level mixed object with a date (date should have produced an output with GMT in it)"
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore );
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore ////////////////////////////////////////////////////////////////////////////////
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore var tostr = {
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore custom1_1: 1.1,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore custom1_2: 1.2,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore custom1_3: {
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore custom2_1: 2.1,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore custom2_2: 2.2,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore custom2_3: {
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore custom3_1: 3.1,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore custom3_2: 3.2,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore custom3_3: 3.3,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore custom3_4: 3.4
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore },
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore custom2_4: 2.4
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore },
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore custom1_4: 1.4,
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore toString: function() {
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore return "custom toString executed";
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore }
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore };
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Assert.areEqual(
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore Y.substitute("{customtostr 1}", { customtostr: tostr }, null, true),
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore "custom toString executed",
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore "failed: custom toString should have been used"
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore );
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore // Assert.areEqual(
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore // Y.substitute("{customtostr dump 1}", { customtostr: tostr }, null, true),
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore // "{custom1_1 => 1.1, custom1_2 => 1.2, custom1_3 => {custom2_1 => 2.1, custom2_2 => 2.2, custom2_3 => {...}, custom2_4 => 2.4}, custom1_4 => 1.4, toString => f(){...}}",
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore // "failed: custom toString should NOT have been used because the dump keyword should override it"
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore // );
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore ////////////////////////////////////////////////////////////////////////////////
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
838d626f7e69c325fea41507371d80369a69026cAdam Moore var template = 'My {prefix} name is {name}. {signature}';
838d626f7e69c325fea41507371d80369a69026cAdam Moore var obj = {
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore prefix:'last',
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore name: 'Zappa',
838d626f7e69c325fea41507371d80369a69026cAdam Moore signature: '{I am a replacement string }{}'
838d626f7e69c325fea41507371d80369a69026cAdam Moore };
637be785ab98741335d5cd6634fddc5f6ecdb41bAdam Moore
838d626f7e69c325fea41507371d80369a69026cAdam Moore // testing {} in the replacement text
838d626f7e69c325fea41507371d80369a69026cAdam Moore Assert.areEqual("My last name is Zappa. {I am a replacement string }{}", Y.substitute(template, obj));
637be785ab98741335d5cd6634fddc5f6ecdb41bAdam Moore
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro Assert.areEqual(
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro '-{test}-',
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro Y.substitute('-{LBRACE}test{RBRACE}-', {test:'test'}, null, true),
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro 'replacement of literals {LBRACE} and/or {RBRACE} failed'
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro );
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro Assert.areEqual(
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro 'done',
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro Y.substitute('{{{three}}}', {
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro three:'two',
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro two: 'one',
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro one: 'done'
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro },null,true),
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro 'recurse failed'
453cd2583d95cd4eef2ec23a7b564ed63d08e0b1Daniel Barreiro );
47f7380215b8e35dd4da7b1dde41e85467f13777Luke Smith }
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore });
a02dc3badfd643b0ea8a5b6b610c53bb0a363ab0Adam Moore
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore
9a76bc095233b0cb0be3a913f5913bfc72c38b6cSatyen Desai Y.Test.Runner.setName("Substitute");
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Y.Test.Runner.add(testSubstitute);
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore Y.Test.Runner.run();
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore });
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore})();
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore</script>
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore</body>
bd4e7bf54bb629b039ba9e22ba57cf09cddce482Adam Moore</html>